1. 程式人生 > >rqnoj PID95:多多看DVD(加強版)

rqnoj PID95:多多看DVD(加強版)

不能 define 必須 -h line nbsp 問題 完全背包 判斷

技術分享
題目描述
多多進幼兒園了,今天報名了。只有今晚可以好好放松一下了(以後上了學後會很忙)。她的叔叔決定給他買一些動畫片DVD晚上看。可是爺爺規定他們只能在一定的時間段L看完。(因為叔叔還要搞NOIP不能太早陪多多看碟,而多多每天很早就困了所以只能在一定的時間段裏看碟)。多多列出一張表要叔叔給她買N張DVD碟,大多都是多多愛看的動畫片(福音戰士,機器貓,火影忍者,櫻桃小丸子……)。這N張碟編號為(123……N)。多多給每張碟都打了分Mi(Mi>0),打分越高的碟說明多多越愛看。每張碟有播放的時間Ti。多多想在今晚爺爺規定的時間裏看的碟總分最高。(必須把要看的碟看完,也就是說一張碟不能只看一半)。顯然叔叔在買碟是沒必要把N張全買了,只要買要看的就OK了,這樣節省資金啊。而且多多讓叔叔慣的特別任性只要他看到有幾張就一定會看完。
可是出現了一個奇怪的問題,買碟的地方只買給顧客M(M
<N)張碟,不會多也不會少。這可讓多多叔叔為難了。怎麽可以在N張碟中只買M張而且在規定時間看完,而且使總價值最高呢? 聰明的你幫幫多多的叔叔吧。 數據範圍 by RQ 對於100%的數據m<n<=100 l<=1000 輸入格式 輸入文件有三行 第一行:兩個數空格隔開的正整數,N,M,L(分別表示叔叔給多多買的碟的數量,商店要買給叔叔的碟的數量,爺爺規定的看碟的時間段)。 第二行到第N行,每行兩個數:T,M,給出多多列表中DVD碟的信息。 輸出格式 單獨輸出一行,表示多多今晚看的碟的總分。 如果商店賣給叔叔的M張碟無法在爺爺規定的時間看完輸出0; 樣例輸入 3 2 10 11 100 1 2
9 1 樣例輸出
題目

真·題目

  if 你是一個小純潔,請看上面的那個題目。

  else 多多是個很汙的小蘿莉,她搞NOIP的叔叔也好不到哪去,這位叔叔熱衷於給侄女買DVD,然後不知道從哪冒出來的爺爺就看不下去了,規定多多每天只能看L時間。多多讓叔叔買n張DVD,每張DVD都有時長Ti和分數(多多的喜愛程度)Mi,好心的商人為了多多的身體著想,只賣給叔叔m張。請你滿足多多的欲望,讓她看碟的分數最高。輸入文件有三行,第一行:兩個數空格隔開的正整數,N,M,L(分別表示叔叔給多多買的碟的數量,商店要買給叔叔的碟的數量,爺爺規定的看碟的時間段)。第二行到第N行,每行兩個數:T,M,給出多多列表中DVD碟的信息。

單獨輸出一行,表示多多今晚看的碟的總分。如果多多一張也看不了欲求不滿輸出0;

  芒果君:先貼代碼~

  

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<iostream>
 4 #define inf -20000000
 5 using namespace std;
 6 int n,m,l,t[1010],s[1010],f[1010][1010],i,j,k;
 7 int main()
 8 {
 9     cin>>n>>m>>l;
10     for(i=1;i<=n;++i) cin>>t[i]>>s[i];
11     for(i=1;i<=n;++i)
12         for(j=0;j<=m;++j)
13             f[i][j]=inf;
14     for(i=1;i<=n;++i)
15         for(j=m;j>=1;--j)
16             for(k=l;k>=t[i];--k)
17                 if(f[j-1][k-t[i]]||j==1) f[j][k]=max(f[j][k],f[j-1][k-t[i]]+s[i]);
18     if(f[m][l]==inf) cout<<"0"<<endl;
19     else cout<<f[m][l]<<endl;
20     return 0;
21 }

  對於剛學01背包的各位dalao來說,如果聽完下節完全背包的課,很快就會對循環的順序產生疑惑。為什麽01背包是逆序?那麽我們一定要從動態規劃的原理出發——每個dp最後的結果都是由無數個子結果“繼承”而來,如果寫成正序循環,那麽就很可能出現當前物品重復放的情況。同時要關註f數組的意義,有時它和最後的大結果是同步的,即“在一定空間內能獲得的最大價值”。在本題當中,由於選取物品的數量有限,就要多加一維來處理,用f[j][k]表示放j個物品,在k空間內獲得的最大價值。為了控制只放一個物品,我們把多出的那層循環設置成逆序,並寫了一個判斷“存在繼承可能”的if語句,這道題就算結束了。

rqnoj PID95:多多看DVD(加強版)