标签:
刷到背包了,背包是一类问题,开个总结记录贴
1 01 背包问题
题意:有N 件物品和一个容量为V 的背包。放入第i 件物品耗费的费用是Ci,得到的价值是Wi。求解将哪些物品装入背包可使价值总和最大
思路:用子问题定义状态:即f[i,v] 表示前i 件物品恰放入一个容量为v 的背包可以获得的最大价值。则其状态转移方程便是:
f[i,v]=max(f[i,v],f[i-1,v-ci]+wi)
伪代码
通过递减顺序V~0,我们可以在每个i循环完后得到最终的状态,即可以省略i
对于恰好装满背包,需要初始化为负无穷
对于只要求最大价值的,需要初始化为0
例题:poj 3624
1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #include<algorithm> 5 using namespace std; 6 int dp[13500]; 7 int w[13500],v[13500]; 8 int main() 9 { 10 int n,W; 11 #ifndef ONLINE_JUDGE 12 freopen("1.in","r",stdin); 13 #endif 14 while(scanf("%d%d",&n,&W)!=EOF) 15 { 16 int i,j,k; 17 memset(dp,0,sizeof(dp)); 18 for(i=0;i<n;i++) 19 { 20 scanf("%d%d",&w[i],&v[i]); 21 } 22 for(i=0;i<n;i++) 23 { 24 for(j=W;j>=w[i];j--) dp[j]=max(dp[j],dp[j-w[i]]+v[i]); 25 } 26 printf("%d\n",dp[W]); 27 } 28 return 0; 29 }
标签:
原文地址:http://www.cnblogs.com/cnblogs321114287/p/4348790.html