記憶體限制:64mb
時間限制:1000ms
special judge: no
accepted:2
submit:11
有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 52 31 2
3 42 2
7
題解:這一問題與一般的01揹包問題相比,重量的範圍太大,而價值範圍較小,所以我們改變dp物件。以往的方法中,我們用dp針對不同重量限制計算最大的價值,這次不妨用dp針對不同價值計算最小的重量。dp[j]表示前i個物品中挑選出價值總和為j時重量的最小值,不存在用inf表示,dp[0]=0。 dp[j]=min(dp[j],dp[j-v[i]]+w[i]), j<=n*maxx, j>=v[i]。然後只需找出dp[j]<=w的最大j。
#include using namespace std;
const int inf= 0x3f3f3f3f;
int dp[10001],w[101],v[101];
int main ()
fill(dp,dp+n*maxx+1,inf);
dp[0]=0;
for (int i=0; i=v[i]; j--)
dp[j]=min(dp[j],dp[j-v[i]]+w[i]);
int j;
for (j=n*maxx; j>=0&&dp[j]>w; j--);
cout<
NYOJ 860 又見01揹包
很經典的一道揹包題目,一般情況,我們都是把揹包的容量作為陣列的變數,但是這一道題,揹包容量資料量太大了。10 9 把容量和價值進行互換 include iostream include stdio.h include string include cstring include cmath incl...
nyoj860又見01揹包
時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 有n個重量和價值分別為wi 和 vi 的 物品,從這些物品中選擇總重量不超過 w 的物品,求所有挑選方案中物品價值總和的最大值。1 n 100 1 wi 10 7 1 vi 100 1 w 10 9 輸入多組測試資料。每組測試資...
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 輸入多...