時間限制:
1000 ms | 記憶體限制:
65535 kb
難度:3 描述
有n個重量和價值分別為wi 和 vi 的 物品,從這些物品中選擇總重量不超過 w
的物品,求所有挑選方案中物品價值總和的最大值。
1 <= n <=100
1 <= wi <= 10^7
1 <= vi <= 100
1 <= w <= 10^9
輸入多組測試資料。
每組測試資料第一行輸入,n 和 w ,接下來有n行,每行輸入兩個數,代表第i個物品的wi 和 vi。
輸出滿足題意的最大價值,每組測試資料佔一行。
樣例輸入
4 5樣例輸出2 31 2
3 42 2
7
一般的01揹包式過不了的
/*#include#includeint max(int a,int b)
int main()
} printf("%d\n",f[w]);
} return 0;
}*/
別人這樣寫的,不知為什麼,還沒想明白!!
首先這道題不能當做普通的01揹包問題,因為w <= 10^9,開不了,那麼大的陣列,肯定有其他的思路,觀察一下
粗略看題意是一道簡單的01揹包問題,但是注意到揹包重量達到10^9,陣列沒法開這麼大,所以得反過來dpdp每個獲得價值的最小重量,然後從大到小查詢小於揹包重量的價值(注意初始化所有價值的重量為盡可能大)
#include#include#includeusing namespace std;
int n,m;
int value[111];
int weight[111];
int dp[111111];
int v;
int main()
for(i=0;i<111111;++i)
dp[0]=0; ////初始化價值為0的重量為0
for(i=1;i<=n;++i)
} for(i=v;i>=0;--i)
} }
return 0;
}
NYOJ 860 又見01揹包
很經典的一道揹包題目,一般情況,我們都是把揹包的容量作為陣列的變數,但是這一道題,揹包容量資料量太大了。10 9 把容量和價值進行互換 include iostream include stdio.h include string include cstring include cmath incl...
nyoj860 又見01揹包
題源 nyoj860 時間限制 1000 ms 記憶體限制 65535kb 難度 3 描述 有n個重量和價值分 別為wi 和 vi 的 物品,從這些物品中選擇總重量不超過 w 的物品,求所有挑選方案中物品價值總和的最大值。1 n 100 1 wi 10 7 1 vi 100 1 w 10 9 輸入多...
NYOJ 860 又見01揹包
時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 有n個重量和價值分別為wi 和 vi 的 物品,從這些物品中選擇總重量不超過 w 的物品,求所有挑選方案中物品價值總和的最大值。1 n 100 1 wi 10 7 1 vi 100 1 w 10 9 輸入多組測試資料。每組測試資...