• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            jake1036

            多重背包(三)

                                 多重背包問題

            一問題描述:
              
                有N種物品和一個容量為V的背包。第i種物品最多有n[i]件可用,每件費用是c[i],價值是w[i]。
                求解將哪些物品裝入背包可使這些物品的費用總和不超過背包容量,且價值總和最大。 
             
             二 問題解決
                該問題可以轉(zhuǎn)換為01背包來計算,方法如下:
                對于每一個n[i] 求取 n[i] - 2 * k + 1> 0的最大值 ,
                將第i種物品分成若干件物品,其中每件物品有一個系數(shù),這件物品的費用和價值均是原來的費用和價值乘以這個系數(shù)。
               
                使這些系數(shù)分別為1,2,4,...,2^(k-1),n[i]-2^k+1,且k是滿足n[i]-2^k+1>0的最大整數(shù)。
                當 n[i] = 13的時候,k為3時 ,13 - 2 ^ 3 +1 > 0 ,達到最大值。
                     對應(yīng)的系數(shù)為 1 2 4 6 。
                當 n[i] = 18的時候,k為4時 ,18 - 2 ^ 4 + 1 >0 ,達到最大值。
                     對應(yīng)的系數(shù)為1 2 4 8 3 。
               
              然后即轉(zhuǎn)換為普通的01背包問題。
             三代碼分析:
              

            #include <iostream>
            #include 
            <vector.h>
            #include 
            <math.h>
             
            using namespace std ; 
             
             
            const int V = 1000  ;
             
            const int T = 5     ;
             
            int w[T] = {5 , 10 , 8 , 15 , 20 } ;                         //表示每一種物品的價值 
             int c[T] = {20 , 30 , 40 ,40 ,100} ;                         //表示每一種物品的體積 
             int n[T] = {13 , 18 ,20 , 15 ,16}  ;                         //表示每一種物品的數(shù)量 
             int f[V + 1] ; // 
             
             vector 
            <int> n_list ; //存儲分解之后的每一個系數(shù)
             vector <int> w_list ; //將分解之后的每一個系數(shù),乘以原來的每一個價值 
             vector <int> c_list ; //將分解之后的每一個系數(shù),乘以原來的每一個體積 
             
             
             
            void iniPackage()       //將n[i]中的每一個數(shù)量,轉(zhuǎn)換成每一個系數(shù) 
             {
               
            for(int i = 0 ; i < T ; i++)
               
            {
                   
            int p = 1 ; 
                   cout
            <<n[i]<<"";
                   
            while(n[i] - pow(2 , p) + 1 >= 0)
                   
            {
                       cout
            <<pow(2 ,p - 1)<<" " ;       
                       n_list.push_back(pow(
            2 , p-1)) ;        //求取每一個系數(shù) 
                       w_list.push_back(w[i] * pow(2 , p-1)) ; // 
                       c_list.push_back(c[i] * pow(2 , p-1)) ;
                              
                       p
            ++        ;                   
                   }
             
                   
            int x = n[i] - pow(2 , p-1+ 1 ;
                   
            if( x > 0)
                   
            {
                       cout
            <<x<<" " ;
                       n_list.push_back(x) ;
                       w_list.push_back(w[i] 
            * x) ;
                       c_list.push_back(c[i] 
            * x) ;                
                   }
                
                   cout
            <<endl ;
               }

               
               
            for(int i = 0 ; i <= V ;i++//表示可以不用全裝滿 
                 f[i] = 0 ;
                        
             }

             
             
            int package()
             
            {
                 iniPackage() ; 
                 
            int size = n_list.size() ;
                 
            for(int i = 0 ; i < size ;i++
                  
            {
                    
            for(int v = V ; v >= c_list[i] ; v--)
                      
            {
                         f[v] 
            = max(f[v] , f[v - c_list[i]] + w_list[i]) ;                  
                      }
                            
                  }

                  
            return f[V] ;      
             }

             
             
             
             
            int main()
             
            {
                 
            int max = package() ;
                 cout
            <<max<<endl ;
                 getchar() ; 
               
            return 0 ;    
             }



              

            posted on 2011-06-28 14:04 kahn 閱讀(403) 評論(0)  編輯 收藏 引用 所屬分類: 算法相關(guān)

            精品久久久无码中文字幕| 国产精品成人99久久久久91gav| 中文字幕无码久久精品青草 | 久久精品一本到99热免费| 久久99精品久久久久久动态图| 日本高清无卡码一区二区久久 | 国产真实乱对白精彩久久| 久久青青色综合| 久久久精品视频免费观看| 久久香蕉综合色一综合色88| 亚洲精品高清国产一线久久 | 亚洲中文字幕无码久久综合网| 久久精品国产一区二区| 伊人久久无码中文字幕| 成人精品一区二区久久| 亚洲日本va中文字幕久久| 国产激情久久久久影院小草| 亚洲狠狠婷婷综合久久久久| 久久久久99精品成人片| 久久线看观看精品香蕉国产| 人妻无码中文久久久久专区| 久久久无码精品亚洲日韩按摩 | 国产精品久久久久久影院 | 久久精品aⅴ无码中文字字幕不卡| 久久美女网站免费| 久久永久免费人妻精品下载| 婷婷久久五月天| 欧美与黑人午夜性猛交久久久| 久久精品视频免费| 久久国产高清一区二区三区| 97久久天天综合色天天综合色hd| 亚洲精品无码久久千人斩| 亚洲精品成人久久久| 国产成人综合久久久久久| 一级做a爰片久久毛片人呢| 久久中文字幕无码专区| 久久强奷乱码老熟女网站 | 亚洲国产成人精品久久久国产成人一区二区三区综 | 亚洲日韩欧美一区久久久久我| 久久天天日天天操综合伊人av| 久久精品国产亚洲Aⅴ香蕉 |