蓝桥杯备考:动态规划dp背包之,多重背包
老样子,我们还是先定义状态表示f[i][j]表示从1到i个背包里,选出重量不超过T的最大价值
接着我们推导状态转移方程
这里我们多重背包就没办法和完全背包一样做优化了,因为我们多重背包毕竟选的数量是受限制的
第三步,初始化,我们全部初始化为0就行了
第四步,结果就存储在我们的f[n][m]里面
实现一下代码
#include <iostream>
using namespace std;
const int N = 210;
int f[N][N];
int w[N],v[N],x[N];
int n,m;
int main()
{
cin >> n >> m;
for(int i = 1;i<=n;i++)
{
cin >> x[i] >> w[i] >> v[i];
}
for(int i = 1;i<=n;i++)
{
for(int j = 0;j<=m;j++)
{
f[i][j] = f[i-1][j];
for(int k = 1;k<=x[i];k++)
{
if(j>=k*w[i])
f[i][j] = max(f[i][j],f[i-1][j-k*w[i]]+k*v[i]);
}
}
}
cout << f[n][m];
return 0;
}
下一篇文章我们来说一下二进制优化版本的多重背包~