揹包問題總結

2021-09-25 00:21:12 字數 1582 閱讀 5613

主要運用動態規劃的思想解決,以下提供比較精簡的**,簡潔易懂。

一、01揹包

1.一維01揹包

#include

#define max(a, b) a > b ? a : b

intmain()

, value[4]

=;//vol存放每乙個物品的體積 value存放對應的價值

//建立動態陣列

int* dp = new int

[v +1]

;memset

(dp,0,

sizeof

(dp)

*(v +1)

);for(

int i =

0; i < num; i++

)for

(int j = v; j >= vol[i]

; j--

) dp[j]

=max

(dp[j]

, dp[j - vol[i]

]+ value[i]);

std:

:cout <<

"最大價值: "

<

<< std:

:endl;

//記憶體釋放

delete[

] dp;

system

("pause");

return0;

}

2.二維01揹包

二維01揹包主要增加一維限制,在前面一維揹包基礎上增加一層迴圈即可。

#include

#define max(a, b) a > b ? a : b

intmain()

, qua[55]

=, value[55]

=;//建立動態陣列

int*

* dp = new int

*[v +1]

;for

(int i =

0; i < v +

1; i++

)for

(int i =

0; i < m; i++

)for

(int j = v; j >= vol[i]

; j--

)for

(int k = q; k >= qua[i]

; k--

) dp[j]

[k]=

max(dp[j]

[k], dp[j - vol[i]

][k - qua[i]

]+ value[i]);

std:

:cout <<

"最大價值: "

<

[q]<< std:

:endl;

//記憶體釋放

for(

int i =

0; i < v +

1; i++

) delete[

] dp[i]

; delete[

] dp;

system

("pause");

return0;

}

揹包問題 01揹包總結

寫這篇部落格的原因是因為自己初學揹包的時候覺得好玄學。只是知道怎麼寫,但是具體是為什麼覺得很玄妙。在此其實希望和我一樣的小白萌新早點明白其中的原理,其實原理很簡單,只要懂了這個圖,我想01揹包就不成問題了。首先要明確這張表是至底向上,從左到右生成的。關於01揹包的題目暫時整理了一點。1.簡單01揹包...

揹包問題總結

標籤 acm dp 揹包 n 物品,乙個揹包,每個物品價值wi 體積vi 揹包容量 c 求最大價值 對於物品 i可選可不選 fi j fi 1 j vi j 0 fi j max c j vi 給定 n 種物品和乙個揹包。第 i種物品的價值是 wi 其體積為vi 揹包的容量為 c 同一種物品的數量無...

揹包問題總結

揹包問題主要是分為三種 0 1揹包,完全揹包,多重揹包 1 0 1揹包 定義 何謂0 1揹包,可以這樣想,那裡有一堆值錢的東西,每一樣東西只有一件,他們的價值和體積都不一樣,現在要你從這n件裡面挑選一些放到乙個容量一定的揹包裡面,使得你的揹包裡的東西總價值最大。對於這些東西的每一件,你可以選擇放進你...