再帰的バックトラッキングを使用して、ペニー(1セント)、ニッケル(5セント)、ダイム(10セント)、および四半期(25セント)を使用して、セント)。 37セントで変更を行う際再帰バックトラッキングmakeChange
たとえば、あなたが使用することができます:
- 1四半期と2ペニー
- 3ダイムと7ペニー
- またはその他の組み合わせ。
あなたのメソッドは、1つのパラメータを受け入れる必要があります。変更するセントの量。
あなたのメソッドの出力は、1行に1つずつ、その金額に加算される各タイプのコインのすべての組み合わせのシーケンスでなければなりません。
たとえば、クライアントコードは、次の呼び出しが含まれる場合:
System.out.println(" P N D Q");
System.out.println("------------");
makeChange(28);
を生成し、全体的な出力は次のようする必要があります。
P N D Q
------------ [3, 0, 0, 1] [3, 1, 2, 0] [3, 3, 1, 0] [3, 5, 0, 0] [8, 0, 2, 0] [8, 2, 1, 0] [8, 4, 0, 0] [13, 1, 1, 0] [13, 3, 0, 0] [18, 0, 1, 0] [18, 2, 0, 0] [23, 1, 0, 0] [28, 0, 0, 0]
この問題を解決に向けた重要な洞察がの概念でありますコイン(ペニー、ニッケルなど)の各貨幣を見て、そのコインの可能なすべての数(1ペニー、2ペニー、...、28ペニー)を試して、その選択からどのような組み合わせを作ることができるかを見てください。たとえば、上記の出力では、まず3ペニーで始まるすべての組み合わせが表示され、次に8ペニーで始まるすべての組み合わせなどが表示されます。
バックトラックには一連の選択肢が含まれているため、コード内に何らかの形でコインの金種を表す必要があります。処理のためにすべてのコイン金種の値のリストを保持することをお勧めします。さまざまなコインの価値を処理するときに、このリストの内容を変更することができます。以下のテンプレートは、(あなたが/コピーあなたのコードのテキストボックスに貼り付けることができます始めるために)出発点である:
public static void makeChange(int amount) {
List coinValues = new LinkedList();
coinValues.add(1); // penny
coinValues.add(5); // nickel
coinValues.add(10); // dime
coinValues.add(25); // quarter
// ... your code goes here ...
はあなたのメソッドに渡された変化量が非負であることを前提としていますが、それもそこでここでは100
を超える可能性が私のコードです:
public static void makeChange(int amount){
int[] acc = new int[4];
makeChange(amount, acc);
}
private static void makeChange(int amount, int[] acc){
if(amount == 0){
System.out.print("[" + acc[0]);
for(int i = 1; i < 4; i++){
System.out.print(", " + acc[i]);
}
System.out.print("]");
System.out.println();
}
if(amount > 0){
acc[0]++;
makeChange(amount - 1, acc);
acc[0]--;
acc[1]++;
makeChange(amount - 5, acc);
acc[1]--;
acc[2]++;
makeChange(amount - 10, acc);
acc[2]--;
acc[3]++;
makeChange(amount - 25, acc);
acc[3]--;
}
}
とmakeChange(28)の呼び出しのために、その出力:
[28, 0, 0, 0]
[23, 1, 0, 0]
[23, 1, 0, 0]
[23, 1, 0, 0]
[23, 1, 0, 0]
[23, 1, 0, 0]
[23, 1, 0, 0]
[18, 2, 0, 0]
[18, 0, 1, 0]
[23, 1, 0, 0]
[18, 2, 0, 0]
[18, 2, 0, 0]
[18, 0, 1, 0]
[23, 1, 0, 0]
[18, 2, 0, 0]
[18, 2, 0, 0]
[18, 2, 0, 0]
[18, 0, 1, 0]
[23, 1, 0, 0]
[18, 2, 0, 0]
[18, 2, 0, 0]
[18, 2, 0, 0]
[18, 2, 0, 0]
[18, 0, 1, 0]
[23, 1, 0, 0]
[18, 2, 0, 0]
[18, 2, 0, 0]
[18, 2, 0, 0]
[18, 2, 0, 0]
[18, 2, 0, 0]
[18, 0, 1, 0]
[23, 1, 0, 0]
[18, 2, 0, 0]
[18, 2, 0, 0]
[18, 2, 0, 0]
[18, 2, 0, 0]
[18, 2, 0, 0]
[18, 2, 0, 0]
[13, 3, 0, 0]
[13, 1, 1, 0]
[18, 0, 1, 0]
[13, 1, 1, 0]
[23, 1, 0, 0]
[18, 2, 0, 0]
[18, 2, 0, 0]
[18, 2, 0, 0]
[18, 2, 0, 0]
[18, 2, 0, 0]
[18, 2, 0, 0]
[13, 3, 0, 0]
[13, 1, 1, 0]
[18, 2, 0, 0]
[13, 3, 0, 0]
[13, 3, 0, 0]
[13, 1, 1, 0]
[18, 0, 1, 0]
[13, 1, 1, 0]
[13, 1, 1, 0]
[23, 1, 0, 0]
[18, 2, 0, 0]
[18, 2, 0, 0]
[18, 2, 0, 0]
[18, 2, 0, 0]
[18, 2, 0, 0]
[18, 2, 0, 0]
[13, 3, 0, 0]
[13, 1, 1, 0]
[18, 2, 0, 0]
[13, 3, 0, 0]
[13, 3, 0, 0]
[13, 1, 1, 0]
[18, 2, 0, 0]
[13, 3, 0, 0]
[13, 3, 0, 0]
[13, 3, 0, 0]
[13, 1, 1, 0]
[18, 0, 1, 0]
[13, 1, 1, 0]
[13, 1, 1, 0]
[13, 1, 1, 0]
[23, 1, 0, 0]
[18, 2, 0, 0]
[18, 2, 0, 0]
[18, 2, 0, 0]
[18, 2, 0, 0]
[18, 2, 0, 0]
[18, 2, 0, 0]
[13, 3, 0, 0]
[13, 1, 1, 0]
[18, 2, 0, 0]
[13, 3, 0, 0]
[13, 3, 0, 0]
[13, 1, 1, 0]
[18, 2, 0, 0]
[13, 3, 0, 0]
[13, 3, 0, 0]
[13, 3, 0, 0]
[13, 1, 1, 0]
[18, 2, 0, 0]
[13, 3, 0, 0]
[13, 3, 0, 0]
[13, 3, 0, 0]
[13, 3, 0, 0]
[13, 1, 1, 0]
[18, 0, 1, 0]
[13, 1, 1, 0]
[13, 1, 1, 0]
[13, 1, 1, 0]
[13, 1, 1, 0]
[23, 1, 0, 0]
[18, 2, 0, 0]
[18, 2, 0, 0]
[18, 2, 0, 0]
[18, 2, 0, 0]
[18, 2, 0, 0]
[18, 2, 0, 0]
[13, 3, 0, 0]
[13, 1, 1, 0]
[18, 2, 0, 0]
[13, 3, 0, 0]
[13, 3, 0, 0]
[13, 1, 1, 0]
[18, 2, 0, 0]
[13, 3, 0, 0]
[13, 3, 0, 0]
[13, 3, 0, 0]
[13, 1, 1, 0]
...(何百行もの出力があります)
なぜ出力が重複するのか教えていただけますか? ありがとうございます!
デバッガでコードをステップ実行しましたか?あなたは何を見つけましたか? –
私のコンピュータにこの奇妙な問題があるのを見て、それはmommentでデバッグすることはできません...だから私は私の心の中でコードを実行することしかできませんでした。 – Amber