1 「」」 2は、 あなたが異なる宗派や金額の合計額のコインを与えられている。あなたはその金額を補うために必要があるとコインの最小数を計算するための関数を書く。お金の量は、いずれかによって作らことができない場合コインの組み合わせ、リターン-1。 3 実施例1: 4 入力:コイン= [1、2、5]、量= 11 5 出力:3 6 解説:11 = 5 + 5 + 1 7 実施例2: 8 入力:コイン= [2]、量= 3 9 出力:-1 10 "" " 11 """ 12 传送门ます。https://blog.csdn.net/qq_17550379/article/details/82909656 13 これは実際に完全にナップザック問題であり、我々は、F(量)を定義し、この式は、 14 正確な量、そのようなアイテムの量が必要なコインの最小数であり、容量のバックパックの量にnアイテムであろう。 15 我々は、コインの必要な数にi番目の項目を検討する 16 F(AMOUNT)=分(F(コイン量[I])+ 1) 。17 1コインの 18である [0、1、2、3、4 、5、6、7、8、9、10、11] 19 硬貨2 20であり 、[0、1、1、2、2、3、3、4、4、5、5、6] 21 コイン5 22である [0 。、1、。1、2、2、。1、2、2 ,. 3 ,. 3,2 ,. 3] 23である "" " 24 クラス解決法1: 25 DEF coinChange(セルフ、コイン、AMOUNT): 26である DP = [フロート(' INF ")] *(+量。1) #正の無限大のフロート( 'INF')マイナス無限大フロート( ' - INF') 27 DP [0] = 0 28 のための COIN にコイン: 29 のための I における範囲(COIN、AMOUNT + 1 ): 30 DP [I] =分(DP [I]、DP [I-COIN] + +1) #!!!動的プログラミング式、アレイ維持 31である リターン -1 IF DP [-1]> AMOUNT 他 DP [-1] #の場合、最終的な溶液F(量)>量、それは解決策を示していない 32 33れている 「」 " 34 後戻り、理解、 35 ここで降順最初の硬貨は、我々は可能な限り低いようにコインの枚数をしたいので、これは、 36 ついで加え中間プルーニング動作で可能な結果として大きな金種の硬貨のための必要性を理解することは容易である 37 コインIF [I] <=ターゲット<コイン[I] *(結果- COUNT): 38である 、コインサイズを置く私達、コインの数と、これは以前より使用されなければならない私たちの目標値よりも大きくなければなりませんか等しいです少ないです。 39 "" " 40 クラス対処方法2: 41である DEF coinChange(セルフ、コイン、AMOUNT): 42である (逆= coins.sort TRUE) 43である 。= LEN(コイン)の結果、len_coins、AMOUNT 1 + 44は、 45 DEFのcountCoins(指標、目標、 COUNT): 46である 非ローカル結果 47 IF ないのターゲット: 48 結果= 分(結果、COUNT) 49 50 用 I で範囲(指数、len_coins): 51 であればコイン[I] <=目標<コイン[I] *(結果- 数): 52 countCoins(I、標的-コイン[i]は、カウント+ 1 ) 53 54 のための I における範囲(len_coins): 55 countCoins(I、量、0) 56 リターン -1 であれば結果>量そう結果