背包问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了背包问题相关的知识,希望对你有一定的参考价值。

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

  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背包的唯一区别是,每个物品可以无限取。

以上是关于背包问题的主要内容,如果未能解决你的问题,请参考以下文章

使用喷气背包导航将自定义过渡动画添加到底部导航设置

在片段的后按防止使用导航图调用前一个片段的 onViewCreated

Android Jetpack 导航禁用滚动位置

0-1背包问题的回溯法代码

c语言背包问题,求高手解答

动态规划_01背包_完全背包_多重背包_分组背包