rqnoj PID95:多多看DVD(加強版)
阿新 • • 發佈:2017-06-23
不能 define 必須 -h line nbsp 問題 完全背包 判斷
單獨輸出一行,表示多多今晚看的碟的總分。如果多多一張也看不了欲求不滿輸出0;
題目描述 多多進幼兒園了,今天報名了。只有今晚可以好好放松一下了(以後上了學後會很忙)。她的叔叔決定給他買一些動畫片DVD晚上看。可是爺爺規定他們只能在一定的時間段L看完。(因為叔叔還要搞NOIP不能太早陪多多看碟,而多多每天很早就困了所以只能在一定的時間段裏看碟)。多多列出一張表要叔叔給她買N張DVD碟,大多都是多多愛看的動畫片(福音戰士,機器貓,火影忍者,櫻桃小丸子……)。這N張碟編號為(1,2,3……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 29 1 樣例輸出 3
真·題目
if 你是一個小純潔,請看上面的那個題目。
else 多多是個很汙的小蘿莉,她搞NOIP的叔叔也好不到哪去,這位叔叔熱衷於給侄女買DVD,然後不知道從哪冒出來的爺爺就看不下去了,規定多多每天只能看L時間。多多讓叔叔買n張DVD,每張DVD都有時長Ti和分數(多多的喜愛程度)Mi,好心的商人為了多多的身體著想,只賣給叔叔m張。請你滿足多多的欲望,讓她看碟的分數最高。輸入文件有三行,第一行:兩個數空格隔開的正整數,N,M,L(分別表示叔叔給多多買的碟的數量,商店要買給叔叔的碟的數量,爺爺規定的看碟的時間段)。第二行到第N行,每行兩個數:T,M,給出多多列表中DVD碟的信息。
芒果君:先貼代碼~
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(加強版)