問題描述:有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揹包問題。採藥 辰辰是個...