01揹包問題詳解 測試資料

2021-10-14 04:47:18 字數 1762 閱讀 5299

有n件物品和乙個容量為v的揹包。第i件物品的重量是c[i],價值是v[i]。求解將哪些物品裝入揹包可使價值總和最大。

0 1即簡單的 要 /不要 這個商品

公式:k代表第幾個商品 c代表揹包剩餘承重

解釋:

1.如果第k件太重,那就不裝他,價值還是上一件的價值

2.如果沒有超重,那就比較:(1)要這件商品(上一次沒有要這件商品且揹包剩餘承重正好等於這第k件商品的重量時的價值加上第k件的價值)(2)不要這件商品(價值還是上一件的價值)

現在有5個商品,揹包容量為6

序號商品大小

商品價值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的狀態的值求出來。這...