码迷,mamicode.com
首页 > 其他好文 > 详细

背包问题总结

时间:2015-03-18 23:07:11      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:

刷到背包了,背包是一类问题,开个总结记录贴

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!