これは、ペンの質問です
まず、ケーキ屋カードを使用し、ギフトカードを起動するには、ケーキのそれぞれの購入を店舗内のケーキを購入するために使用することができます。カード素子Rの額面は、無効なカードの残高を閉じた後、一度だけ使用してもよいです。ケーキの価格のすべての種類が整数で保存することが知られ、チェックアウト後にカードの残額を作る少なくとも、購入する方法を見つけます。
状態が戻って個々の判断を保持するためのトピックを、だけでなく、0-1ナップザック問題を購入する方法を探しているされ、その後、彼らは待つべきである(複数の結果があるかもしれない、それは最後の状態を保持することはできません)、
バックトラック時に無効な出力を避けるように注意する必要があります
1つの#include " pch.h " 2の#include <iostreamの> 3の#include < ストリング > 4 使って 名前空間STDを、 5 静的 のconst int型 M = 20 。 6 静的 のconst int型 array_ [] = { 1、2、5、9、10、11、8、3、20、80 }。 7 8 int型 **テスト(INT&N-) 9 { 10 // Mケーキの初期値array_、ショッピングカードの番号である 11。 12である N- = はsizeof(array_)/ はsizeof(INT ) 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 }