背包问题
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背包的唯一区别是,每个物品可以无限取。
以上是关于背包问题的主要内容,如果未能解决你的问题,请参考以下文章