0
点赞
收藏
分享

微信扫一扫

【动态规划】多重背包问题

飞鸟不急 2022-02-09 阅读 57

朴素算法:

可以把ni个物品逐个拆分,得到\sumni个物品。原问题转化为01背包问题

dp[ i ][ v ] = max( dp [ i-1 ][ v-k*ci ] + k*wi) , 0<=k<=ni

核心代码:

for(int i=1;i<=N;i++){
   for(int j=0;j<=V;j++){
        for(int k=0;k<=n[i];k++){
            if(j>=c[i]*k){
               dp[i][j]=max(dp[i-1][j-c[i]*k]+w[i]*k,dp[i][j]);
             }
       } 
   }
}

空间优化:(滚动数组 二维降一维)

for(int i=1;i<=N;i++){
   for(int j=V;j>=0;j--){
        for(int k=0;k<=n[i];k++){
            if(j>=c[i]*k){
               dp[j]=max(dp[j-c[i]*k]+w[i]*k,dp[j]);
             }
       } 
   }
}

举报

相关推荐

0 条评论