二维费用01背包
题目描述
核心思路
这个是二维费用01背包问题。那么什么是二维费用01背包问题呢?我们知道在一维费用01背包问题中,一般只有体积这个约束条件,然后求将何种物品装入背包能够得到最大价值。二维费用01背包问题,只不过是又增加了一个约束条件,比如题目中有两个约束条件 “总体积不超过背包容量” 和 “总重量不超过背包可承受的最大重量”,此时就是二维费用01背包问题。
我们先来回顾一下一维费用01背包问题
f[j]
表示背包容量为
j
j
j时,能放入的最大价值,因此当背包容量为
V
V
V时,能放入的最大价值就是
f
[
V
]
f[V]
f[V],即为全局最优解。
一维费用01背包的代码:
cin >>n>>V; //物品数量 背包容量
for(int i=1;i<=n;i++)//枚举物品
{
int v,w;
cin >>v>>w; //体积 价值
for(int j=V;j>=v;j--) //枚举体积
f[j]=max(f[j],f[j-v]+w);
}
printf("%d\n",f[V]);
那么我们可以参照一维费用01背包问题,再增加一维即可:
f[j][k]
表示背包容量为
j
j
j,且承重为
k
k
k时,能放入的最大价值。因此当背包容量为
V
V
V,承重为
M
M
M时,能放入的最大价值就是
f
[
V
]
[
M
]
f[V][M]
f[V][M],即为全局最优解。
二维费用01背包问题的代码:
cin >>n>>V>>M; //物品件数 背包容量 背包承重
for(int i=1;i<=n;i++)//枚举物品
{
int v,m,w; //体积 重量 价值
cin >>v>>m>>w;
for(int j=V;j>=v;j--)//枚举体积
for(int k=M;k>=m;k--)//枚举承重
f[j][k]=max(f[j][k],f[j-v][k-m]+w);
}
printf("%d\n",f[V][M]);