有n件物品和乙個容量為v的揹包。第i件物品的重量是c[i],價值是v[i]。求解將哪些物品裝入揹包可使價值總和最大。
0 1即簡單的 要 /不要 這個商品
公式:k代表第幾個商品 c代表揹包剩餘承重
解釋:現在有5個商品,揹包容量為61.如果第k件太重,那就不裝他,價值還是上一件的價值
2.如果沒有超重,那就比較:(1)要這件商品(上一次沒有要這件商品且揹包剩餘承重正好等於這第k件商品的重量時的價值加上第k件的價值)(2)不要這件商品(價值還是上一件的價值)
序號商品大小
商品價值01
2124
2343
4545
6輸入
5 6
1 22 4
3 44 5
5 6
輸出
套公式+看注釋
#include
#include
int n,v;
//n代表n件商品 v代表揹包承重
double
**b;
int*w;
//每個物品重量
double
*v;//每個物品價值
void
knapsack()
for(i=
0;i<=n;i++)}
w=(int*
)malloc
((n+1)
*sizeof
(int))
; v=
(double*)
malloc
((n+1)
*sizeof
(double))
;for
(i=1
;i<=n;i++
)//結束建立
//核心**//公式
int k,c;
for(k=
1;k<=n;k++)}
}}intmain()
從最下面乙個商品開始遞迴
每層遞迴判斷
1.限制1:商品是否訪問完 完了則return 0;
2.限制2:判斷是否大小超過揹包剩餘大小,超過了則判斷下乙個商品
3.如果都沒有限制住,則進入上面乙個商品的判斷,並判斷要這個商品與不要這個商品價值的大小
原始碼:
#include
doubleb(
int k,
int c)
;//k代表第幾件,w代表揹包容量還剩多少 b代表價錢
double list[
1010][
2];int
main()
}double max=
b(n-
1,v)
;//最多可以得到max元
printf
("%.0lf\n"
,max)
;return0;
}doubleb(
int k,
int c)
}}
當資料過大時,執行時間會大大增加。
那麼可以用陣列的方法解決
01揹包問題詳解
01揹包問題簡單描述 有乙個揹包和n個物品,揹包的承載量為c,每件物品重量為w i 價值為v i 問如何裝才能使揹包中物品的總價值最大?解題方法 f i,j 在前i個物品中選擇若干件放在承重為j的揹包中,可以取得的最大的價值。f i,j max f i 1,j w i v i f i 1,j 決策 ...
01揹包問題詳解
n個物品,每個物品有乙個wi的重量和pi的價值,現在有乙個重w的揹包問放進物品後的最大值。首先是記憶化搜尋 dp i j 在前i件物品裡面選擇不超過重量j的最大價值 int rec int i,int j 基於上面的思想我們有遞推式dp i j 這樣的話時間複雜度和空間複雜度都是o nw 可以對空間...
0 1揹包問題詳解
網上好多關於揹包問題的解釋,自己也看了,感覺解釋的不容易通俗易懂,所以自己來寫乙個非常容易懂得。0 1揹包問題說的是,給定揹包容量w,一系列物品,每個物品只能取一件,獲取最大值。採用動態規劃求解,動態規劃的一般規律都是 在什麼什麼前i個狀態下的最大值或者最小值的前提下,然後再把i的狀態的值求出來。這...