這應該是最基礎的揹包問題了,但正因為他的基礎,他的思想會被用在很多dp題中,所以這裡有必要對他剖析一下。
我們應該掌握的方法有兩種
1、二維陣列。
2、滾動陣列。
後面那個一看就要高階一些,但是確實對動歸沒有太大的幫助,所以大家一定要把第一種方法學好!第二種方法我不做解釋,只會黏貼**,大家認真腦補一下應該也是可以理解的。
這裡定義揹包叫做f[i][j],i代表前i個物品的總重為j,f[i][j]一起表示前i個物品的總共價值,所以我們就可以很明顯的寫出動態轉移方程式:
if(w[i]<=v) f[i][v]=max(f[i-1][v],f[i-1][v-w[i]]+c[i]);
else f[i][v]=f[i-1][v];//important
if(w[i]<=v) f[i+1][v+w[i]]=max(f[i][v]+c[i],f[i+1][v+w[i]]);
······
這當然是有原因的,是因為害怕一直往後扔會出現重複的情況!!!
下面上**:
#include
#include
#include
#include
using
namespace
std;
int m,n;
int w[35],c[35];
int f[35][205];
int main()
for(int i=1;i<=n;++i)
}printf("%d",f[n][m]);
return
0;}
p.s:中間加important的地方一定不要漏寫了!
直接貼**,大家腦補吧!
#include
#include
using
namespace
std;
int bag[305];
int m,n;
int main()
printf("%d",ans);
return
0;}
謝謝採納! 01揹包 解題
假設一共有n件物品,第 i 件物品的價值為 vi 重量為wi,乙個小偷有乙個最多只能裝下重量為w的揹包,在總量不超過w的情況下讓總值盡量高。求最大總價值。n,w 4,5 w 2,1,3,2 v 3,2,4,2 解一 def dfs w int,v int,i int,n int,w int int ...
0 1揹包問題(動態規劃) 解題報告
利用動態規劃,以自底向上的方式解各子問題。解題思路 此問題可轉化為 給定c 0,wi 0,vi 0,1 i n,要求找出一 個n元0 1向量 x1,x2,xn xi 1 i n,使得 wixi c,而且 vixi達到最大。因此,0 1揹包是乙個特 殊的整數規劃問題 max vixi s.t.wixi...
HDU 2546 飯卡(01揹包) 解題報告
昨天吧揹包九講中最基礎的01揹包看完,做了2602。結果晚上比賽相同題目卻做不出。苦想幾個小時。解題思路 要使剩餘錢最少,應該留下塊錢買最貴的東西 標記為t 注意金額m 5 的情況!接下來就是用剩下的m 5元買除t以外的菜。每種菜只能買一次。就構成揹包問題。include include inclu...