1. 程式人生 > >【動態規劃】完全背包

【動態規劃】完全背包

max cout col 一份 span blank ref http ++

完全背包與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; }

【動態規劃】完全背包