NYOJ 860 又見01揹包 揹包問題

2021-08-22 11:26:00 字數 1460 閱讀 6029

問題**

描述

有n個重量和價值分別為wi 和 vi 的 物品,從這些物品中選擇總重量不超過 w

的物品,求所有挑選方案中物品價值總和的最大值。

1 <= n <=100

1 <= wi <= 10^7

1 <= vi <= 100

1 <= w <= 10^9

輸入

多組測試資料。

每組測試資料第一行輸入,n 和 w ,接下來有n行,每行輸入兩個數,代表第i個物品的wi 和 vi。

輸出

滿足題意的最大價值,每組測試資料佔一行。

上傳者tc_張友誼

分析

1.另類的揹包問題。基礎的是用 同等重量 找 價值最大的 該問題則是同等價值重量最小的,因為該揹包的容量可能會很大

2.陣列不要越界

3.將 dp 初始化為最大值,因為要從中找最小值

執行**

#include #include #include #include using namespace std;

int dp[100*100+5],w[100+5],v[100+5];

int n,m;

int sumv;//價值總和

int main()

memset(dp,0x3f,sizeof(dp)); //初始化為最大值

dp[0]=0; w[0]=0;v[0]=0; //讓陣列從一開始

for (int i=1;i<=n;i++)

for (int j=sumv;j>=v[i];j--)

dp[j]=min(dp[j],dp[j-v[i]]+w[i]); //dp[價值]=最小重量

//dp[j]表示 價值為j 的時候的最小重量

/*dp[價值]=最小重量 即同等價值最小重量 (現在的思想)= 同等重量最大價值(原來的思想)

*/for(int i =sumv;i>0;i--)//從最大價值往下遍歷 只要符合dp[j] <= 容量 j為最大價值

if(dp[i]<=m)

}return 0;

}

樣例輸入

4 5

2 31 2

3 42 2

樣例輸出

執行結果:

總結;通過這個題,讓自己對01揹包的有了更深的理解,也對其原始思想理解的更透徹了

nyoj 860 又見01揹包(01 揹包)

又見01揹包 時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 有n個重量和價值分別為wi 和 vi 的 物品,從這些物品中選擇總重量不超過 w 的物品,求所有挑選方案中物品價值總和的最大值。1 n 100 1 wi 10 7 1 vi 100 1 w 10 9 輸入 多組測試...

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 輸入多組測試資料。每組測試資...