揹包問題(C語言)

2021-10-11 03:26:07 字數 2469 閱讀 9737

問題描述

有n件物品(是件不是種!),每件物品有自己的重量w[n]和價值v[n];現有乙個容量為bag的揹包,要在揹包容量滿足的條件下將物品們裝入揹包,使總價值最大,試問應該怎樣放入?最大值為多少?

基本思路

該問題中每個物體僅有放入或不放入兩種情況,故稱為01揹包問題。

現有二元函式maxvalue(i,wight) 表示在考慮前i件物體的情況下,容量為wight的揹包所能達到的最大價值。

考慮是否放入第i個物體:

若不放入,則有maxvalue(i,wight)=maxvalue(i-1,wight) ;

若放入,則有maxvalue(i,wight)= maxvalue(i-1,wight-w[i])+ v[i] 。

故該函式滿足以下遞迴式:

maxvalue(i,wight)=max

建立二維陣列maxvalue[n+1][wight+1],由動態規劃打表即可求出每個狀態下的maxvalue值,其中maxvalue[n+1][wight+1]的值即為所求。再通過對該值進行遞迴回溯,即可找到滿足該值的物品組成。

下面是**

#include

intmax

(int a,

int b)

intmain()

int maxvalue[

100]

[100]=

;//動態規劃表

//製表

for(

int i =

1; i <= n; i++)}

//打表

printf

("w i g h t: ");

for(

int wight=

1; wight <= bag; wight++

)printf

("%-3d"

, wight)

;printf

("\n");

for(

int i =

1; i <= n; i++

)printf

("\n");

}printf

("\n");

//輸出最大值

printf

("max=%d\n"

, maxvalue[n]

[bag]);

//最大值回溯

int judge[

100]=;

int x = n, y = bag;

while

(x !=

0&& y !=0)

else x--;}

//輸出滿足條件的物體

for(

int i =

1; i <= n; i++

)}

問題描述:

在01揹包的基礎上,現在每件物體的數量不再為1,而是各自給定,依然求滿足題意的最大總價值。

基本思路:

很容易想到,我們可以模仿01揹包的做法,將n件某種物體分為n個1件同種物體,再01揹包一下。這樣就會增加n件物體。為了減少增加的物體個數,我們可以利用二進位制優化。

有引理:

n以內的正整數,都可以用1, 2, 4,…, 2(k-1), n-2k+1中任意幾個數之和表示

於是,對於n件某種物體,我們便可以增加k個物體,每個物體的重量和價值分別為原物體的1, 2, 4,…, 2(k-1), n-2k+1倍,這樣便可以模擬該種物體放0~n個的所有情況。

#include

#include

intmax

(int a,

int b)

intmain()

int dp[

10000];

int index =0;

for(

int i =

1;i <= n;i++

) w1[

++index]

= t * w[i]

; v1[index]

= t * v[i];}

memset

(dp,0,

sizeof

(dp));

for(

int i =

1;i <= index;i++

)for

(int j = bag;j >= w1[i]

;j--

) dp[j]

=max

(dp[j]

,dp[j - w1[i]

]+ v1[i]);

printf

("%d\n"

,dp[bag]);

}

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...

動態規劃 揹包問題(c語言)

揹包問題 揹包所能容納重量為10 共五件商品,商品重量用陣列m儲存m 5 每件商品的價值用陣列n儲存,n 5 求揹包所能裝物品的最大價值。include include intmain n 5 int flag 5 符號標誌位,表示地某個點是否裝入揹包,裝入為1,未裝入為0 inti,j,k int...

C 揹包問題

在0 1揹包中,物體或者被裝入揹包,或者不被裝入揹包,只有兩種選擇 迴圈變數i,j的意義 前i個物品能夠裝入載重量為j的揹包中 陣列value的意義 value i j 表示前i個物品能加載重量為j的揹包中的最大價值 若w i j,第i個物品不被裝入揹包,否則,第i個物品放入揹包後的最大價值 val...