首先,需要設定乙個二維陣列t,其中t[i][j]表示利用前i個物品來裝進容量為j的揹包的所能夠獲得的最大價值。
當只考慮第i件物品時,可將情況分為是否放入第i件物品兩種:
1.01揹包——每個物品僅有乙個
不放第i件物品:t[i][j]=t[i-1][j]
放入第i件物品:t[i][j]=t[i-1][j-weights[i]]+values[i]
2.完全揹包——每個物品有無數個
不放第i件物品:t[i][j]=t[i-1][j]
放入第i件物品:t[i][j]=t[i][j-weights[i]]+values[i]
3.多重揹包——每個物品數量有限
不放第i件物品:t[i][j]=t[i-1][j]
放入第i件物品:t[i][j]=t[i-1][j-k*weights[i]]+k*values[i]
注意:
(1)放入第i件物品的前提是當前空間j>=放入的物品的空間,即(j-weights[i]>=0或者j-k*weights[i]>=0);
(2)多重揹包問題放入和不放入可以直接合為一種情況,即k的取值多乙個k=0;
(3)對於t陣列一定要合理合適正確的進行初始化。對於找數值最大的問題,直接全部初始化為0即可;但是對於找數值最小的問題,在最開始需要將t陣列全部初始化為乙個超大值,然後並將t[0][0]初始為0;
(4)在這類題中,若有n類物品,一般從i=1開始進行對應,所以for迴圈一般為for(i=1;i<=n;i++);另一層表示空間的迴圈為for(j=0;j<=s;j++)。
1.問題:有數量有限的幾種面值的貨幣,要求用最少的張數湊成乙個給定的總值。
2.實現**
#define m 10000
//用於初始化陣列
int t[30]
[30]=
,n,space;
//n是種類,space是目標值
int weights[10]
;//面值
int values[10]
;//每一張的價值
int numbers[10]
;//每一種面值對應的數量
//處理輸入
void
input()
//陣列t初始化,這裡是找最小值,於是往大了初始化
void
initialize()
//01揹包
void
zeroonebackpack()
}
//完全揹包
void
completelybackpack()
}
//多重揹包
void
multiplebackpack()
t[i]
[j]=min;
}}
//輸出結果
void
output()
int
main()
3.執行結果 0 1揹包問題 動態規劃 解釋與C語言實現
動態規劃 物品數n 5,揹包容量c 10。物品重量序列w 物品價值序列v 求最佳裝包序列。假設簡單題目 揹包容量5,物品abca bc重量2 34價值2 23 可以直接推出 選ab價值總和最高,可最後驗證是否正確 表橫軸為揹包當前容量12345 縱軸為物品序號abc。內容意義為當前容量 橫軸 的最優...
動態規劃 揹包問題(c語言)
揹包問題 揹包所能容納重量為10 共五件商品,商品重量用陣列m儲存m 5 每件商品的價值用陣列n儲存,n 5 求揹包所能裝物品的最大價值。include include intmain n 5 int flag 5 符號標誌位,表示地某個點是否裝入揹包,裝入為1,未裝入為0 inti,j,k int...
揹包問題的C語言實現
假設有乙個揹包的負重最多可達8公斤,而希望在揹包中裝入負重範圍內可得之總價物品,假設是水果好了,水果的編號 單價與重量如下所示 0 李子 4kg nt 4500 1 蘋果 5kg nt 5700 2 橘子 2kg nt 2250 3 士多啤梨 1kg nt 1100 4 甜瓜 6kg nt 6700...