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

背包问题

时间:2016-01-27 13:05:09      阅读:125      评论:0      收藏:0      [点我收藏+]

标签:

  背包问题是动态规划的基础,也是最易理解的动态规划,有著名的背包九讲可以查询,我就稍微写一下。

  1. 01背包

  这个是最基础的背包,即这个物品只有一件,只需确定放还是不放即可。

  二维状态转移方程:f[i,x]=max{f[i-1,x],f[i-1,x-c[j]]+w[j]}

  一维状态转移方程:f[x]=max{f[x],f[x-c[j]]+w[j]}

  需要注意的是,使用一维时,枚举x需要逆序,这样才可以保证f[x]不受前后影响,二维则随意。

  同时,我们还需要注意题目,若题目要求恰好装满背包,则初始化f[0]=0,其他为负无穷;若没要求恰好装满,则全部初始化为0。

  hdu2602为模板题。

#include <cstdio>
#include <cstring>
#define FOR(i,x,y) for(int i=x;i<=y;++i)
#define rFOR(i,x,y) for(int i=x;i>=y;--i)
int f[1010],t,v,n,a[1010][2];
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        memset(f,0,sizeof(f));//数组初始化
        scanf("%d%d",&n,&v);
        FOR(i,0,n-1) scanf("%d",&a[i][0]);
        FOR(i,0,n-1) scanf("%d",&a[i][1]);
        FOR(i,0,n-1) rFOR(x,v,a[i][1]) if(x>=a[i][1]&&f[x]<f[x-a[i][1]]+a[i][0])
            f[x]=f[x-a[i][1]]+a[i][0];//DP方程
        printf("%d\n",f[v]);
    }
    return 0;
}

 

  2. 完全背包

  与01背包的唯一区别是,每个物品可以无限取。

背包问题

标签:

原文地址:http://www.cnblogs.com/cons/p/5162768.html

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