动态规划完全背包
Posted som_nico
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态规划完全背包相关的知识,希望对你有一定的参考价值。
完全背包与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; }
以上是关于动态规划完全背包的主要内容,如果未能解决你的问题,请参考以下文章