多重背包模板

void solve(){
    for(int i=1;i<=n;++i){ ///n是物品个数
        int k;
        for(k=1;k*2<c[i]+1;k<<=1) ///c[i]是第 i 个物品的个数
            for(int j=sum;j>=k*w[i];--j)  ///w[i] 是第 i 个物品的重量
                dp[j]=max(dp[j],dp[j-k*w[i]]+k*v[i]);  ///v[i] 是第 i 个物品价值
        k=c[i]+1-k;
        for(int j=sum;j>=k*w[i];--j)
            dp[j]=max(dp[j],dp[j-k*w[i]]+k*v[i]);
    }
}
原文地址:https://www.cnblogs.com/Kurokey/p/5717638.html