問題:
1分、2分、5分、10分コイン4種類、各所与セントのコイン無制限の数N(N <= 100000)、番号と組み合わせてNセントを構成することができますか?
URL:https://www.nowcoder.com/question/next?pid=18874168&qid=587672&tid=29129649
Huawei社は、DPが第一、V [i]は硬貨の金種を格納する、[N-所望0-nから記憶された硬貨の最小数を定義する単純なDPと同様な質問、問題起因タイトルからの平面図であり、初期DP [0]は0、状態遷移方程式由来DPを= [I] =分{DP [I-1] + 1、DP [IV [J] +1}。
状態方程式を理解することができるため、N所与セント、私は通貨を使用するように設定されている数は、通貨単位が最後のKで、クレジットの完全な使用を想定kは、その後、kは、その後、数N / Kであります式があります。
DPは、[I]は、[N] = DP [I-1]〜[N-0 * K] + DP [I-1]〜[N-1 * K] + DP [I-1] [N-2 * K] + ....... + DP [I-1] [NN / K * K]、 すなわち、すべての場合は、 - k個のクレジットを使用しない場合、クレジット・K、2を用いてk個のクレジットの使用.......全てのkクレジットと、状態遷移方程式は、2桁のグループの形で得ることができます。
DPは一次元の方程式を簡略化:DP [I] DP = [I] + DP [IV [J] 。
コード:
インポートjava.util.Scanner; パブリック クラスメイン{ 公共 静的 ボイドメイン(文字列引数は、[]){ スキャナ入力 = 新しいスキャナ(System.in)。 INT、N = input.nextInt()。 INTコイン[] = {1,2,5,10 }。 INT [] DP = 新しい int型 [100001 ]。 DP [ 0] = 1 ; 以下のために(int型、iは4 <; I = 0 iは++ ){ ため(int型 J =コイン[I]; J <= nであり、j ++ ){ DP [J]=(DP [J] + DP [J-コイン[I])%十億七。 } } のSystem.out.println(DP [N])。 } }
理解することができる:それぞれのためのお金の総額を形成することができ、誘導された二次元配列の開始前と同じようにすることができ、1枚のコインの利用、1枚のコイン2、2枚の1コイン、通貨... 3 3 ....ので、反復を停止し、お金がjが増加しており、マイナス式が一定の繰り返し、マイナスの下にコインの数は絶えず増加しています
最初の硬貨、クレジット2を減算する方法...得られた反復数を停止し、必要な結果を得ることができます。
タイムコードの複雑さは、O(N)、暴力的溶液法よりもはるかに小さくなっています。
DP [J] =(DP [J] + DP [J-コイン[I])%十億七。