C語言中的0 1揹包問題

2021-08-10 02:29:04 字數 1205 閱讀 6579

描述:

需對容量為c 的揹包進行裝載。從n 個物品中選取裝入揹包的物品,每件物品i 的重量為wi ,價值為pi 。對於可行的揹包裝載,揹包中物品的總重量不能超過揹包的容量,最佳裝載是指所裝入的物品價值最高。

輸入:

多個測例,每個測例的輸入佔三行。第一行兩個整數:n(n<=10)和c,第二行n個整數分別是w1到wn,第三行n個整數分別是p1到pn。

n 和 c 都等於零標誌輸入結束。

輸出:

每個測例的輸出佔一行,輸出乙個整數,即最佳裝載的總價值。

輸入樣例:

1 2

1 1

2 3

2 2

3 4

0 0

輸出樣例: 1 4

#include

int output[100]=;

int cnt=0;//結果和結果個數設為全域性變數,為beibao和main函式間需要傳輸的資料。

int beibao(int n,int c,int w[20],int v[20])

; int i,k;

//建立二維陣列,i表示前i件物品,k表示總重量不超過k。

//陣列內元素全部初始化為0

for(i=1;i<=n;i++)//二重迴圈討論i,k取不同值所有可能的情況

else dp[i][k]=dp[i-1][k];}}

output[++cnt]=dp[n][c];//最優解為有n件物品,總重量不超過c時。

//將結果存放在output陣列中最後統一輸出。

}int main()

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

beibao(n,c,z,p);//每輸入完一組資料,進行一次計算,求出這組資料的最優解。

}for(int i=1;i<=cnt;i++)

}

這道題的想法與取棋子問題相似。都是找出一種遞推關係,並從最基本的情況開始逆推,用多重迴圈討論所有可能,最後得出答案。

就如取棋子問題設二維陣列討論堆中所剩棋子和每次可取棋子數一樣,這裡設二維陣列討論前i件商品和容量上限k。

用i++和k++乙個乙個遍歷,雖然其中很多k容量不能充分利用,很多i,k不同取值時結果並沒有變化,但這樣討論不會遺漏任何情況,可以省略很多思考。

0 1揹包問題 C語言

cw表示已裝重量和,i表示考察到第i個物品,w表示揹包可承受重量,n表示物品個數,物品重量儲存在陣列a中,max表示當前最大值 void bag int i,int cw,int w,int n,int item,int max return bag i 1,cw,w,n,item,max if c...

01揹包問題 C

有i件物品和乙個容量為volume total的揹包。第n件物品的體積是c n 價值是w n 體積是指物品在揹包中佔據的位置,即放入的物品的總體積不能揹包總容量 每種物品僅有一件,可以選擇放或不放。求解將哪些物品裝入揹包可使價值總和最大。輸入物品的總個數i,和揹包的最大容積volume total ...

揹包問題 01揹包問題

n個物品,總體積是v,每個物品的體積的vi,每個物品的最大價值是wi,在不超過v的體積下求最大價值 eg揹包容積為 5 物品數量為 4 物品的體積分別為 物品的價值分別為 思路定義乙個二位陣列int f new int n 1 v 1 f i j 就表示在1 i個物品中選取體積小於v的情況的最大價值...