<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      動態規劃(1)

      背包問題

      (1)0 1 背包  —— 每件物品最多使用一次

      求解將哪些物品裝入背包,可使這些物品的總體積不超過背包容量,且總價值最大。輸出最大價值。

       

      #include <iostream>
      #include <algorithm>
      using namespace std;
      const int N = 1e3+10 ; 
      int n,m ; 
      int v[N], w[N] ; // 體積 價值 
      int f[N][N] ;  // 前 i 個物品的體積不超過 j 的情況下的價值 
      
      int main(){
          cin>>n>>m ; 
          for(int i=1; i<=n ; i++ )  cin>>v[i]>>w[i];   
          for(int i=1; i<=n ; i++ )
              for(int j = 0;  j<=m ; j++ )
              {
                  f[i][j] = f[i-1][j] ; // 坐標這種情況一定存在
                  if( j >= v[i] ) // 體積小于j
                      f[i][j] = max(f[i][j], f[i-1][j-v[i]] + w[i]) ; 
              } 
         cout<<f[n][m] ;
      return 0; }

      優化成一維的

      #include <iostream>
      #include <algorithm>
      using namespace std;
      const int N = 1e6+10 ; 
      int n,m ; 
      int v[N], w[N] ; // 體積 價值 
      int f[N] ;  // 前 i 個物品的體積不超過 j 的情況下的價值 
      int main(){
          cin>>n >>m ;  
          for(int i=1; i<= n ; i++ )  cin>>v[i]>>w[i] ; 
          for(int i=1 ; i<=n; i++ )
              for(int j=m ; j>=v[i];  j--)
              {
                  f[j] = max(f[j], f[j-v[i]] + w[i]);
              }
          cout<<f[m]<<endl ; 
          return 0;
      } 

       

      (2)完全背包 —— 每件物品有無限個

      和0 1背包的代碼的區別只在第二個for循環的判斷順序

      求解將哪些物品裝入背包,可使這些物品的總體積不超過背包容量,且總價值最大。輸出最大價值。

       

      #include <iostream>
      #include <algorithm>
      using namespace std;
      const int N = 1e3+10 ; 
      
      int n,m ; 
      int v[N], w[N] ; // 體積 價值 
      int f[N][N] ;  //  
      
      
      int main(){
           
          cin>> n>> m ; 
          for(int i= 1; i<= n; i++ ) cin>>v[i]>>w[i] ; 
          
          for(int i=1 ; i<=n ; i++ )
              for(int j=0; j<=m ; j++ )
                  for( int k = 0 ; k*v[i] <= j ; k++ )
                      f[i][j] = max(f[i][j], f[i-1][j-v[i]*k] + w[i]*k );
          
          cout<<f[n][m]<<endl ;     
          return 0;
      }     

      優化為二維

       

      #include <iostream>
      #include <algorithm>
      using namespace std;
      const int N = 1e3+10 ; 
      int n,m ; 
      int v[N], w[N] ; // 體積 價值 
      int f[N][N] ;  //  
      int main(){
          cin>> n>> m ; 
          for(int i= 1; i<= n; i++ ) cin>>v[i]>>w[i] ; 
          
          for(int i=1 ; i<=n ; i++ )
              for(int j=0; j<=m ; j++ )
              {
                  f[i][j] = f[i-1][j] ; 
                  if( j>=v[i] ) 
                      f[i][j] = max(f[i][j], f[i][j-v[i]] + w[i] ) ; 
              }
      cout
      <<f[n][m]<<endl ; return 0; }

      優化為一維

      #include <iostream>
      #include <algorithm>
      using namespace std;
      const int N = 1e3+10 ; 
      int n,m ; 
      int v[N], w[N] ; // 體積 價值 
      int f[N] ;  //  
      int main(){
           
          cin>> n>> m ; 
          for(int i= 1; i<= n; i++ ) cin>>v[i]>>w[i] ; 
          
          for(int i=1 ; i<=n ; i++ )
              for(int j=v[i]; j<=m ; j++ )
              {
                  f[j] = max(f[j], f[j-v[i]] + w[i] ) ; 
              }
              
          cout<<f[m]<<endl ;     
          return 0;
      }     

       

      (3)多重背包 —— 每個物品有 S[ i ] 個

      #include <iostream>
      #include <algorithm>
      using namespace std;
      const int N = 1e3+10 ; 
      int n,m ; 
      int v[N], w[N],s[N] ; // 體積 價值 數量 
      int f[N][N] ;  //  
      int main(){
           
          cin>> n>> m ; 
          for(int i= 1; i<= n; i++ ) cin>>v[i]>>w[i]>>s[i] ; 
          
          for(int i=1 ; i<=n ; i++ )
              for(int j=0; j<=m ; j++ )
                  for(int k=0; k<=s[i] && k*v[i] <= j ; k++ )
                      f[i][j] = max(f[i][j], f[i-1][j-v[i]*k] + k*w[i] ) ; 
                              
          cout<<f[n][m]<<endl ;
          return 0;
      }     

      優化,采用二進制方法,先轉為二進制存儲,再采用01背包方法解

       

      #include <iostream>
      #include <algorithm>
      using namespace std;
      const int N = 3e4+10, M = 3000 ; 
      int n,m ; 
      int v[N], w[N] ; // 體積 價值 數量 
      int f[N] ;  
      int main(){
           
          cin>> n>> m ; 
          int cnt = 0 ;
          for(int i= 1; i<= n; i++ ){
              int a,b,s ; 
              cin>>a>>b>>s ;     // 設 s = 50 
              int k = 1; 
              while(k<s)    //二進制 1 + 2 + 4 + 8 + ... < s 
              {
                  cnt++ ; 
                  v[cnt] = a*k ;
                  w[cnt] = b*k ;
                  s -= k ;
                  k *= 2 ;
              }
              if(s>0) // 31 + 19 = 50 
              {
                  cnt++ ;
                  v[cnt] = a*s ; 
                  w[cnt] = b*s ;
              }    
          } 
          
          n = cnt++ ; 
          
          for(int i=1 ; i<=n ; i++ )
              for(int j=m; j>=v[i] ; j-- )
                  f[j] = max(f[j], f[j-v[i]] + w[i] ) ; 
                              
          cout<<f[m]<<endl ;     
          return 0;
      }     

       

      (4)分組背包 —— 每一組里面有若干個,組里面只能選一個

       

      #include <iostream>
      #include <algorithm>
      using namespace std;
      const int N = 3e3+10, M = 3000 ; 
      int n,m ; 
      int v[N][N], w[N][N], s[N]; // 體積 價值 數量 
      int f[N] ; 
       
      int main(){
           
          cin>> n>> m ; 
          
          for(int i= 1; i<= n; i++ )
          {
              cin>>s[i] ; 
              for(int j=0; j<s[i] ; j++) 
              {
                  cin>>v[i][j]>>w[i][j];
              }
          } 
          
          for(int i=1 ; i<=n ; i++ )
              for(int j=m; j>=0 ; j-- )    // 轉 0 1背包 
                  for(int k=0; k<s[i]; k++)    // 尋找每個組 
                      if(v[i][k] <= j)    // 第i組的第k件物品 
                          f[j] = max(f[j], f[j-v[i][k]] + w[i][k] ) ; 
                              
          cout<<f[m]<<endl ;     
          return 0;
      }     

       

      posted @ 2023-04-30 16:22  尊滴菜  閱讀(23)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产精品亚洲二区在线播放| 久久中文字幕一区二区| 亚洲偷自拍国综合| 国产精品无码不卡在线播放 | 久久久av男人的天堂| 国产自产在线视频一区| 91久久天天躁狠狠躁夜夜| 中文字幕av无码免费一区| 精品国产成人国产在线观看| 2020年最新国产精品正在播放| 97久久综合亚洲色hezyo| 日韩幕无线码一区中文| 亚洲 日韩 国产 制服 在线| 在线亚洲午夜理论av大片| 四虎永久精品在线视频| 四虎库影成人在线播放| 亚洲一区二区三区久久受| 亚洲精品无码久久一线| 亚洲大尺度一区二区三区| 国产精品高潮无码毛片| 日本精品一区二区不卡| 99精品国产一区二区三| 欧美日本在线一区二区三区| 91亚洲国产三上悠亚在线播放| av在线播放无码线| 久久精品免费观看国产| 免费看婬乱a欧美大片| 亚洲国产精品日韩av专区| 国产av成人精品播放| 亚洲熟妇熟女久久精品综合 | 狠狠色丁香婷婷综合尤物| 波多野结衣高清一区二区三区| 亚洲欧洲一区二区精品| 中文字幕日本六区小电影| 精品亚洲国产成人性色av| 阳山县| 丁香五月亚洲综合在线国内自拍 | 波多野结衣无内裤护士| 免费观看添你到高潮视频| 日韩本精品一区二区三区| 日韩精品中文字幕有码|