問題描述:
有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...