一共m个物品,背包最大体积为t。每个物品有对应着体积和价值,每个物品能使用一定次,求背包中最大的价值
f[i][j]表示使用前i个物品,最大体积为j的情况下,所装的最大值。
与01背包不同的是,一个物品可以使用一定的次数。总体思路与01背包相同,加一个循环,第k个第i物品要不要使用(也可以这么理解,k第i个物品,重新编号,相当于是第i个物品,第i+1个物品,第i+2个物品…第i+k-1个物品。所有物品重新编号,就又是01背包问题)
#include<bits/stdc++.h>
using namespace std;
int w[10001]; //w[i]表示第i个物品的体积
int v[10001]; //v[i]表示第i个物品的价值
int f[10001]; //f[i]表示体积不超过i的情况下,所能装的最大价值
int m[10001]; //m[i]表示第i个物品有多少个
int main()
{
int n,t;
scanf("%d%d",&n,&t);
for(int i=1;i<=n;i++)
scanf("%d%d%d",w[i],v[i],m[i]);
for(int i=1;i<=n;i++)
for(int j=t;j>=w[i];j--)
for(int k=1;k<=m[i];k++)
f[i]=max(f[i],f[i-w[i]]+v[i]);
printf("%d",f[t]);
return 0;
}