揹包問題之0 1揹包 二

2021-06-06 17:57:32 字數 748 閱讀 3244

問題描述:有n個物品,第i個物品的重量為w[i],價值為v[i]。選一些物品放入揹包中,使揹包內物品總重量恰好為w的前提下,總價值盡量大。

輸入:有多組測試資料,每組資料第一行為2個正整數,分別代表物品的個數n和揹包的容量w,接下來的n行,每行2個正整數,用空格隔開,分別代表物品的重量w和價值v, 當n、w同時為0時結束測試,此時不輸出。所有輸入數字的範圍大於等於0,小於等於1000。

輸出:若能恰好放滿揹包則輸出最大總價值,否則輸出no,每組輸出佔一行。

解題思路:與0-1揹包(一)類似,設f[i][j]表示前i(1<=i<=n)個物品選擇放入容量為j(0<=j<=n)的揹包中能恰好放滿時達到的最大總價值,並用f[i][j]=-1表示前i個物品不能恰好把容量為j的揹包放滿,因此對於第i個物品能不能放入容量為j的揹包中不僅取決於j>=w[i],還要滿足f[i-1][ j-w[i] ]!=-1;

故: if(j>=w[i]&&f[i][j-w[i]]!=-1)

else

當然仍然可以像0-1揹包(一)一樣用滾動陣列來優化空間。

源**如下:

#include #include #define maxn 1001

int f[maxn];

int main()

if(f[w]!=-1)

printf("%d\n",f[w]);

else

printf("no\n");

} return 0;

}

揹包問題之01揹包

01揹包就是說針對每一件物品,有選擇裝入或者放棄,是屬於動態規劃類的問題。現在假設我們有m件物品,各有價值,揹包承重為10,假設當前可用的承重量為v,當前在抉擇第m件物品是否放入,重量為w1,價值為v1,那麼,如果不放入,我們的價值應該保持不變,並與之前算出的最大價值相同,如果放入,放入後的價值就是...

揹包問題之0 1揹包

0 1揹包是最基本的揹包問題,其核心思路就在於每個物品的放與不放 每個物品最多只能放一次 題目有 n 個物品和乙個大小為 m 的揹包.給定陣列 a 表示每個物品的大小和陣列 v 表示每個物品的價值.問最多能裝入揹包的總價值是多大?樣例輸入 m 10,a 2,3,5,7 v 1,5,2,4 輸出 9 ...

揹包問題之0 1揹包

揹包問題大部分是這樣的 有乙個容量為v的揹包和一些物品。這些物品有兩個屬性,體積 和價值 每種物品只有乙個。要求用這個揹包裝下價值盡可能多的物品,求其最大價值。因為在最優解中,每個物品都有兩種可能的情況,即在揹包中存在 或者不存在 揹包中有0個或者1個該物品 因而被稱為0 1揹包問題。採藥 辰辰是個...