標籤:des style blog http io strong 檔案 資料
時間限制:20000ms單點時限:1000ms記憶體限制:256MB描述
且說之前的故事裡,小Hi和小Ho費勁心思終於拿到了茫茫多的獎券!而現在,終於到了小Ho領取獎勵的時刻了!
等等,這段故事為何似曾相識?這就要從平行宇宙理論說起了………總而言之,在另一個宇宙中,小Ho面臨的問題發生了細微的變化!
小Ho現在手上有M張獎券,而獎品區有N種獎品,分別標號為1到N,其中第i種獎品需要need(i)張獎券進行兌換,並且可以兌換無數次,為了使得辛苦得到的獎券不白白浪費,小Ho給每件獎品都評了分,其中第i件獎品的評分值為value(i),表示他對這件獎品的喜好值。現在他想知道,憑藉他手上的這些獎券,可以換到哪些獎品,使得這些獎品的喜好值之和能夠最大。
提示一: 切,不就是0~1變成了0~K麼
提示二:強迫症患者總是會將狀態轉移方程最佳化一遍又一遍
提示三:同樣不要忘了最佳化空間哦!
輸入
每個測試點(輸入檔案)有且僅有一組測試資料。
每組測試資料的第一行為兩個正整數N和M,表示獎品的種數,以及小Ho手中的獎券數。
接下來的n行描述每一行描述一種獎品,其中第i行為兩個整數need(i)和value(i),意義如前文所述。
測試資料保證
對於100%的資料,N的值不超過500,M的值不超過10^5
對於100%的資料,need(i)不超過2*10^5, value(i)不超過10^3
輸出
對於每組測試資料,輸出一個整數Ans,表示小Ho可以獲得的總喜好值。
-
範例輸入
-
5 1000144 990487 436210 673567 581056 897
-
範例輸出
-
5940
因為要最佳化記憶體,所以開了一維數組,覺得開二維數組佔用空間太大,可能要崩!(100000*500)!!!
#include <stdio.h>#include <string.h>int f[100002];int c[600];int w[600];int max(int a, int b){ return a>b?a:b;}int main(){ int n, m; int i, j, k; while(scanf("%d %d", &n, &m)!=EOF) { for(i=1; i<=n; i++ ) { scanf("%d %d", &c[i], &w[i] ); } memset(f, 0, sizeof(f)); for(j=1; j<=n; j++) { for(k=0; k<=m; k++) { if( k>=c[j] ) { f[k]=max( f[k], f[k-c[j]]+w[j] ); } } } printf("%d\n", f[m] ); } return 0;}