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揹包 有的物品可以取無限次 完全揹包 有的物品可以取的次數有乙個上限 多重揹包 求解將哪些物品裝入揹包可使這些物...