该问题与“完全背包”相比,在每个物品的选取次数上给出了限定,即选取次数k不能无限的增大,其方程和“完全背包”的极度相似,只是k的限定条件发生了变化。
#include<cdtdio>
using namespace std;
int dp[1005];
int weight[1005],value[1005],num[1005];
int main()
{
int n,m;
scanf("%d%d",&n,&m);//n是物品的种数,m是背包的容积
memset(dp,0,sizeof(dp));
for(int i=1; i<=n; i++)
scanf("%d%d%d",&weight[i],&value[i],&num[i]);
for(int i=1; i<=n; i++)//每种物品
for(int k=0; k<num[i]; k++)//其实就是把这类物品展开,调用num[i]次01背包代码
for(int j=m; j>=weight[i]; j--)//正常的01背包代码
dp[j]=max(dp[j],dp[j-weight[i]]+value[i]);
printf("%d",dp[m]);
return 0;
}