码迷,mamicode.com
首页 > 其他好文 > 详细

【动态规划】完全背包

时间:2018-05-12 19:17:35      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:void   fun   i++   div   style   val   http   max   完全   

完全背包与01背包的区别就是 01背包只有一次, 而完全背包有无限

我的01背包

完全背包

 dp[i-1][j - k*weight[i]] +k*value[i]   经历了01背包,那么前面这个式子就很好理解了,k就代表无限个。

照例,先来一份最朴实无华的递推:

int dp[maxn][maxn];
void fun(){
    for(int i=0;i<n;i++){
        for(int j=0;j<W;j++){
            for(int k=0;k*w[i]<j;k++){
                dp[i+1][j]=max(dp[i+1][j],dp[i][j-k*w[i]]+k*v[i]);
            }
        }
    }
    cout<<dp[n][W]<<endl;
}

三重循环呀~  k最坏的情况是0~W  那么O(nW^2)

优化一下:

int dp[maxn][maxn];
void fun(){
    for(int i=0;i<n;i++){
        for(int j=0;j<W;j++){
            if(j<w[i]) dp[i+1][j]=dp[i][j];
            else
                dp[i+1][j]=max(dp[i][j],dp[i+1][j-w[i]]+v[i]);        
        }
    }
    cout<<dp[n][W]<<endl;
}

 

【动态规划】完全背包

标签:void   fun   i++   div   style   val   http   max   完全   

原文地址:https://www.cnblogs.com/Kohinur/p/9029370.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!