背包总结

来源:互联网 发布:淘宝上的现代汉语词典 编辑:程序博客网 时间:2024/06/10 14:09

[0/1背包]

1 二维的状态转移方程

   for(int i = 1 ; i <= n ; i++){

        for(int j = sumV ; j >= 0 ; j--){

              dp[i][j] = dp[i-1][j];

              if(j >= v[i])

                 dp[i][j] = max(dp[i][j] , dp[i-1][j-v[i]]+w[i]);  

        }

   }

2 一维的状态转移方程

   for(int i = 1 ; i <= n ; i++)

        for(int j = sumV ; j >= v[i] ; j--)

             dp[j] = max(dp[j] , dp[j-v[i]]+w[i]);


[完全背包]  

1 状态转移方程

for(int i = 1 ; i <= n ; i++)

        for(int j = v[i] ; j <= sumv ; j++)

             dp[j] = max(dp[j] , dp[j-v[i]]+w[i]);


[多重背包]

1 状态转移方程

   for(int i = 1 ; i <= n ; i++)

         MultiplePack(F ,C,W ,M )
         if C · M ≥ V
             CompletePack(F ,C,W )
             return
         k ←1
         while k < M
               ZeroOnePack(kC,kW )
               M ←M − k
               k ← 2k
         ZeroOnePack(C · M ,W · M )


2 模板

       for(int i = 1 ; i <= 4 ; i++)
          multiplePack(v[i],w[i],num[i]);

     void zeroOnePack(int cost , int weight){
           for(int i = sumV ; i >= cost ; i--)
                dp[i] = max(dp[i] , dp[i-cost]+weight);
     }
     void completePack(int cost , int weight){
           for(int i = cost ; i <= sumV ; i++)
                dp[i] = max(dp[i] , dp[i-cost]+weight);
     }
     void multiplePack(int cost,int weight,int amount){
           if(cost*amount >= sumV){
                completePack(cost , weight);
                return;
           }
           int k = 1;
           while(k < amount){
                 zeroOnePack(k*cost , k*weight);
                 amount -= k;
                 k *= 2;
           }
           zeroOnePack(amount*cost , amount*weight);
     }


   优化空间复杂度的方法,可以只使用二维的数组:当每件物品只可以取一次时变量 v 和 u 采用逆序的循环,当物品有如完全背包问题时采用顺序的循环,当物品有如多重背包问题时拆分物品









原创粉丝点击