该问题与“完全背包”相比,在每个物品的选取次数上给出了限定,即选取次数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;  
    }