题目描述:
输入:
3 6
2 2 5
3 3 8
1 4 1
输出:
9
题意:有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。
思路:首先多重背包问题可以转换为01背包来解决,关键就是如何转换。我们只需要在遍历到第i件的时候,多加入一个for循环,遍历s个物品并且在动态转移方程中进行合并操作!我们需要注意的是,我合并出的物品体积,一定不能超过当前背包的总体积(j),不然合并是没有意义的。
代码:
#include<iostream>
using namespace std;
const int N=1e5+1;
int n, m;
int v[N],w[N],s[N];
int dp[N];
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%d%d%d",&v[i],&w[i],&s[i]);
}
int a=0;
for(int i=1;i<=n;i++)
{
for(int j=m;j>=v[i];j--)
{
for(int k=1;k<=s[i]&&k*v[i]<=j;k++)
{
dp[j]=max(dp[j],dp[j-k*v[i]]+k*w[i]);
}
}
}
printf("%d", dp[m]);
return 0;
}