各種揹包問題動態規劃 C語言實現

2021-10-06 02:25:28 字數 1759 閱讀 8242

首先,需要設定乙個二維陣列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...