C ++ 0-1ナップザック問題の動的計画

特定の後に補足コンテンツ_(:з「∠)_最初のコードを貼り付け

  1つの#include <iostreamの>
   2の#include <fstreamの>
   3の#include <CTIME>
   4の#include <アルゴリズム>
   5の#include <WINDOWS.H>
   6。 使用した 名前空間STD;
   7  の#define N 10000
   。8  
  。9  // INT [W 5。 ] = {0、2、3、4、5};             // 品の体積2,3,4,5
 10  // INT V [5] = {0、3、4、5 ,. 6};             // 製品値3,4,5,6
 11。 // INT = bagV 8;                             // バックパックサイズ
12である INT DP [N] [N]。                    // ダイナミックプログラミングのテーブル
 13は、 // INT項目[5];                             // 最適解
14  
15  空隙 FindMax(INT K、INT N-、INT W []、int型 V []){                     // 動的プログラミング
16      のためにINT I = 1 ; Iは= Kを<; Iは++ ){
 17。         ためのINT J = 1。 ; J <= N; J ++ ){
 18は、             IF(J < W [I])
 。19                  DP [I] [J]がDPを= [Iは- 1 ] [J]。
20              
21                  DP [I] [J] = MAX(DP [I - 1 ] [j]は、DP [iが- 1 ] [J - W [I] + V [I])。
22          }
 23      }
 24  }
 25  
26  空隙 findWhat(int型 I、int型 J、INT [] W、int型 V []、int型の項目[]){                 // 最优解情况
27      であれば(私は> 0 ){
 28          であれば( DP [I] [J] == DP [I - 1 ] [J]){
 29              項目[I] = 0;
30              findWhat(I - 1 、J、W、V、項目)。
31          }
 32          そう であれば(J - W [i]が> = 0 && DP [I] [J] == DP [I - 1 ] [J - [I] W] + V [i])と{
 33              項目[I ] = 1 34              findWhat(I - 1、J - W [i]と、W、V、項目)。
35          }
 36      }
 37  }
 38  
39  ボイドプリント(int型 K、int型、N INTの項目[]){
 40      / *{//动态规划表输出ための式(I ++; iはK + 1 <I = 0 INT)
 41          のための(INT J = 0であり、j <N + 1、J ++){
 42              COUT << DPを[I] [J] << '「;
43          }
 44          COUT << ENDL。
45      }
 46      COUT << ENDL。* / 
47      はcout << バックパックの中に置かれるべき項目番号は次のとおりです。;
48      のためにint型 I = 0、I <K + 1 ; iが++){             // 最优解输出
49          であれば(項目[I] == 1 50           coutの<< I << '  ' ;
51      }
 52      COUT << ENDL。
53  }
 54  
55  INTメイン(ボイド56  {
 57      LARGE_INTEGER nFreq。
58      LARGE_INTEGER nBeginTime。
59      LARGE_INTEGER nEndTime。
60      ofstreamのをFOUT。
61      ダブルコスト。
62      int型I、J、M、N、K。
63      裁判所未満<< あなたがプログラムを実行する回数を入力してください:;
64     >> CIN メートル;
 65      // int型object_amount [M];
 66      // ダブルランタイム[M]; 
67      fout.open(" backpack.txt " は、App :: iOSの);
 68      IF(!FOUT){
 69          CERR、< < " 開くことができませんファイル'backpack.txt' " << てendl;
 70          リターン - 1。;
 71がある     }
 72      (ios_base :: fout.setf 固定 ios_base :: FloatField、);        // 科学表記使用してデジタル出力を防ぐ
73      srand関数((符号なし整数)時間(NULL))。
74      のために(i = 0 ; iは<M; iは++ ){
 75          N =ランド()%10000 76          K =ランド()%10000 77          // object_amount [I] = K。
78          FOUT << K << " " 79 INTの項目[K]。
80          COUTは<< " " << I + 1 << " 番目のテストのバックパック格子数は、" << N << ENDL。
81の          coutの<<         " << I + 1 << " 番目のテストのオブジェクト量は: << K << ENDL;
 82          INT W [k]は、
 83          のint V [k]は、
 84          のmemset(DP、0はsizeof (DP));
 85          [W 0 ] = 0 ;
 86          [V 0 ] = 0 ;
 87          (J = 1、J <K、J ++ ){
 88              W [J] =ランド()%100 ;
 89              V [J] =ランド() %1000年;
90          }
 91          QueryPerformanceFrequency(&nFreq)。
92          QueryPerformanceCounterの(&nBeginTime)。
93          findMax(K、N、V、W)。
94          findWhat(K、N、W、V、項目)。
95          プリント(K、N、項目)。
96          QueryPerformanceCounterの(&nEndTime)。
97          費用=(ダブル)(nEndTime.QuadPart - nBeginTime.QuadPart)/(ダブル)nFreq.QuadPart。
98          // ランタイム[I] =コスト; 
99          FOUT <<コスト<< てendl;
100の          coutの<< "110     } * / 111     fout.close()。
112      coutの<<          
 " 成功!" << てendl;
113      リターン 0 ;
114 }

 

おすすめ

転載: www.cnblogs.com/Jesse-Cavendish/p/11771656.html