揹包問題例題

2021-10-02 17:55:36 字數 1952 閱讀 5759

p1060 開心的金明

題目鏈結

思路:0 1揹包問題

0

1揹包問題的模板,dp陣列用二維也可以都是一樣的道理,一維是壓縮了空間

for i=1..

.n//物品從1到n分別決定選或者不選

for j=ba**...0

//揹包從最大體積到0

if(j>=w[i]

)//可以裝的下

dp[j]

=max

(dp[j]

,dp[j-w[i]

]+v[i]);

//前表示不選擇,後表示選擇

**

#include

using

namespace std;

int v[30]

,w[30];

int dp[

50000];

int maxv,n;

intmain()

for(

int i=

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

printf

("%d\n"

,dp[maxv]);

return0;

}

題目鏈結

思路:0 1揹包問題求方案數

方程

值得推敲

dp[j]表示j元的最多方案數

dp[j]=dp[j]+dp[j-w[i]];//每增加乙個新菜,選擇這個新菜,省j-w[i]元,

有dp[j-w[i]]個方案,不選擇新菜,有dp[j]個方案,繼承上乙個

ac**

#include

using

namespace std;

intmain()

; cin>>n>>m;

for(

int i=

0;i) dp[0]

=1;for

(int i=

0;icout<;return0;

}

0-1揹包問題,轉化一下就行。總體積減去最多裝體積,就是剩餘最少體積

ac**

#include

using

namespace std;

int ba**,n;

int a[31]

;int dp[

20001]=

;int

main()

for(

int i=

0;icout<;}

完全揹包問題

模板

for i=1..

.n for j=0..

..ba** //只是遍歷順序換了

if(j>=w[i]

) dp[j]

=max

(dp[j]

,dp[j-w[i]

]+v[i]

)

換順序就能實現完全揹包的原因

如果倒序,dp陣列每次使用的都是i-1次狀態的最優情況;

如果順序,dp陣列後面的使用了前面的dp陣列,但前面的是更新過的,i次狀態;這樣就重複使用了i次狀態,就把i物品重複選了,達到了我們無限選的目的。

ac**

#include

using

namespace std;

int t,n;

int a[

10001][

2];int dp[

100001];

intmain()

for(

int i=

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

cout<;}

揹包問題例題總結

揹包問題之前學了,不過現在又忘得差不多了 可惜之前沒有寫部落格總結 現在結合例題重新複習一下。例1 有 n 個重量和價值分別為wi,vi的物品,現從這些物品中挑選出總量不超過 w 的物品,求所有方案中價值總和的最大值。輸入包含多組測試用例,每一例的開頭為兩位整數 n w 1 n 10000,1 w ...

動態規劃揹包問題(例題)

物品編號 1 2 3 4 物品體積 2 3 4 5 物品價值 3 4 5 6 求容積為8的揹包能裝的最大價值為多少?動態規劃解題步驟 1 確定狀態 注意 動態規劃一般要開陣列,首先要明確陣列的每個元素所代表的意義。確定狀態需要兩個意識 1 最後一步 2 子問題。2 轉移方程的確定 3 初始化條件和邊...

例題 混合揹包

problem description 乙個旅行者有乙個最多能用v公斤的揹包,現在有n件物品,它們的重量分別是w1,w2,wn,它們的價值分別為c1,c2,cn。有的物品只可以取一次 01揹包 有的物品可以取無限次 完全揹包 有的物品可以取的次數有乙個上限 多重揹包 求解將哪些物品裝入揹包可使這些物...