プレイテーブルをバックトラック需要を達成するために、線形計画アルゴリズム

これは、ペンの質問です

まず、ケーキ屋カードを使用し、ギフトカードを起動するには、ケーキのそれぞれの購入を店舗内のケーキを購入するために使用することができます。カード素子Rの額面は、無効なカードの残高を閉じた後、一度だけ使用してもよいです。ケーキの価格のすべての種類が整数で保存することが知られ、チェックアウト後にカードの残額を作る少なくとも、購入する方法を見つけます。

状態が戻って個々の判断を保持するためのトピックを、だけでなく、0-1ナップザック問題を購入する方法を探しているされ、その後、彼らは待つべきである(複数の結果があるかもしれない、それは最後の状態を保持することはできません)

バックトラック時に無効な出力を避けるように注意する必要があります

  1つの#include " pch.h " 
  2の#include <iostreamの>
   3の#include < ストリング >
   4  使って 名前空間STDを、
  5  静的 のconst  int型 M = 20   6  静的 のconst  int型 array_ [] = { 12591011832080 }。
  7  
  8  int型 **テスト(INTN-)
   9  {
 10      // Mケーキの初期値array_、ショッピングカードの番号である
11。 
12である      N- = はsizeof(array_)/ はsizeofINT 13は     INT ** P = 新しい新しい INT * [N-];
 14      以下のためにint型 I = 0、I <N - 、I ++は15      {
 16          P [I]は= 新しい新しい INT [Mの+ 1 ];
 17      }
 18である     ためINT I = 0; I <N-; I ++ 19。         ためのINT J = 0 ; J <= M; J ++ 20は              P [I] [J] = 0 ;
 21は 
22である     // 線形計画
 23      // P [0]に割り当てられた
24の     IF([array_ 0 Pは、[] <= M)0 ] [array_ [ 0 ] = array_ [ 0 ];
 25      INT I = 1 ; I <N-; I ++ 26である     {
 27          // 正面から購入していません開始購入
28          IF(array_ [I] <=M)
 29          {
 30              P [I] [array_ [I] = [I] array_;
 31である         }
 32          // 決意は、それが購入する場合の累積ケース
33がある         ためINT J = 1 ; J <= M; J ++ 34である         {
 35              IF(P [I - 。1!] [J] = 0 36              {
 37 [                  int型値= P [I - 1 ] [J] + I] [array_;
 38である                 // 後レイヤ場合物品
39                  IF(値<= M)
 40                 {
 41は                      P [I] [値] = 値;
 42である 
43れる                 }
 44である                 // 物層購入しない場合は
 45                  // のみがこの削除する方法再生する場合、このテーブルは、再帰的な方法のすべてを再生するために使用される
46  
47                  P [I] [J] = P - 〔I 1。[J]];
 48  
49  
50              }
 51である         }
 52は 
53である     }
 54は 
55      のためにint型 I = 0 ;私は<N-Iが++ 56である     {
 57である         ためINT J =。1 ; J <= M; J ++ 58          {
 59              COUT << P [I] [J] << "  " ;
 60          }
 61は          COUT << ; ENDL
 62である     }
 63が     戻り、P
 64  }
 65  
66  
67  // 電流を取り出します第n層、値の残量のための
68  INT doPrint(INT ** P、整数 nは、INTの値)
 69  {
 70      int型の和= 0 ;
 71である     // 購入する場合、直接終端
72     IF(値- array_ [N-] == 0 73である     {
 74          COUTが<< array_ [N-] << ENDL;
 75          リターン 1。;
 76      }
 77      INTの左=値- [N-] array_;
 78      IF(左> 0 79      {
 80  
81          のためにINT I = N - 1。 ; I> = 0 ; i-- 82          {
 83              // データは、継承があるため、バランスの状態の各プレイテーブル担当者が、いずれかを述べることは不可能であるが、これは、各層の非ゼロ値ではありません意義がある
 84を             //それは後で再生テーブルに十分な資金を持っている場合にのみ、場合再帰的であることができる(すなわち、左array_ [I]> = 0)、 条件が再帰的に満たさ無効ない
 85              @ すなわち、状態が実際に発生層が継承され、そして後よりも後に来る
86              のIF(!P [I] [左] = 0 &&左- array_ [I]> = 0 87              {
 88                  COUT << [N-] << array_ "  " ;
 89                  SUM = + doPrint (P、I、左);
 90              }
 91である         }
 92      }
 93      リターンSUM;
 94  
95  }
 96  
97  のint main()の
 98  {
 99     // 線形プログラミング、及び購入は種々の段階の計画出力
 100      // Mケーキの初期値array_、ショッピングカードの番号である
101      INT N- = 0 ;
 102      INT ** P = テスト(N-);
 103      INTの最大値= 0 ;
 104      // 最大値検索
105を     するためにINT I = N - 1。 ; I> = 0 ; i-- 106      {
 107          のためのINT J = M; J> = 1。 ; J、 108          {
 109              IF (P [I] [J])
 110             {
 111                  マックス= P [I] [J]。
112                  ブレーク113              }
 114          }
 115          であれば(MAX)のブレーク116      }
 117      COUT << " ----------------------------- " << ENDL。
118      INTの和= 0 119      のためのint型 I = N - 1 ; I> = 0 ; i-- 120      {
 121          和+ = doprint(P、I、MAX)。
122      }
 123      COUT << " あり   " << << SUM " 種法購入" << ENDL;
 124      COUTが<< " の最大の金種用いて統合することができ、" <<最大<< ENDLと、
 125  
126 }

 

おすすめ

転載: www.cnblogs.com/jing19960917/p/11411513.html