1。はじめに
著者は、大学でのアルゴリズム競争でそのような質問に遭遇しました。今、私はあなたとそれを共有します:8つの銀コインがabcdefghであり、そのうちの1つは実際の通貨とは異なる偽造通貨であることが知られていますが、それがより軽いか重いかはわかりません。バランスを使用して、どのコインが最小比較数の偽造通貨であるかを決定する方法も、偽造通貨が実際の通貨よりも軽いか重いことを知っています。
2。分析
この質問が、どの偽造通貨が非常に単純であるかを解決することだけである場合、問題はそれほど複雑ではなく、結果を得るために戻って反発するだけです。問題の難しさに対処するために、最小限の手順を使用する必要があります! ! !
以前のデータ構造の問題と比較して、再帰とバックトラッキングがあります。今日、私たちはツリーと呼ばれる新しいコンセプトと接触しなければならないかもしれません。名前が示すように、数値構造は、分析図がツリーのようで、ブランチノードなどのさまざまな情報があることを意味します。ツリー構造は、私たちの議論ではなく、データ構造のより大きな章です。この質問では、木の小分子である決定木を導入します。
最初に8つの銀貨を解くための数学モデルを構築しましょう。簡単な状況はこのようなものです。シルバーコインABCDEFGなどに名前を付けます。次に、A+B+CとD+E+Fを比較します。それが等しい場合、偽造通貨はgまたはhでなければなりません。最初に、どれが重いか、GまたはHを比較します。 Gが重い場合は、A(Aは実際の通貨)と比較します。 gがaに等しい場合、gは実際の通貨であり、hは偽の通貨です。 HはGよりも軽いため、Gは実際の通貨であるため、偽造通貨の重量は実際の通貨よりも軽いです。
等しくない場合はどうなりますか?どうしたの?最終的な回答が得られるまで、ブランチを順番に比較します!
3.サンプル図
上記の分析に基づいて、完全な決定ツリー図を作成できます。
4。コード
パブリッククラスコイン{private int []コイン; public coins(){coins = new int [8]; for(int i = 0; i <8; i ++)コイン[i] = 10; } public void setfake(int weight){coins [(int)(math.random() * 7)] = weight; } public void fake(){if(coins [0]+コイン[1]+コイン[2] ==コイン[3]+コイン[4]+コイン[5]){if(coins [6]> coins [7])比較(6、7、0);それ以外の場合は、(7、6、0); } else if(コイン[0]+コイン[1]+コイン[2]>コイン[3]+コイン[4]+コイン[5]){if(coins [0]+コイン[3] ==コイン[1]+コイン[4])比較(2、5、0); else if(コイン[0]+コイン[3]>コイン[1]+コイン[4])比較(0、4、1); if(コイン[0]+コイン[3] <コイン[1]+コイン[4])比較(1、3、0); } else if(コイン[0]+コイン[1]+コイン[2] <コイン[3]+コイン[4]+コイン[5]){if(コイン[0]+コイン[3] ==コイン[1]+コイン[4])比較(5、2、0); else if(コイン[0]+コイン[3]>コイン[1]+コイン[4])比較(3、1、0); if(コイン[0]+コイン[3] <コイン[1]+コイン[4])比較(4、0、1); }}保護されたvoid比較(int i、int j、int k){if(coins [i]> coins [k])system.out.print( "/nfake coins" +(i + 1) + "heevier"); else system.out.print( "/n fake currency" +(j + 1) + "lighter"); } public static void main(string [] args){if(args.length == 0){system.out.println( "input fake fake currency weight(10よりも大きいまたは小)"); System.out.println( "Ex。JavaCoins 5");戻る; }コイン8コイン= new Coins(); EightCoins.setfake(integer.parseint(args [0])); EightCoins.fake(); }}結果:
偽造通貨の重量を入力します(10よりも大きいまたは小さい)
元。 Javaコイン5
一般的な問題解決方法は次のとおりです。コードを慎重に検討できます。このコードでは、上記の分析で十分です。誰もがそれについて考えて、自分で残りを学ぶ必要があります。そうすれば、彼らはそれを深く理解できるようにします。
要約します
上記は、Javaプログラミングの実装のための8つのシルバーコインコードの解決に関するこの記事のすべての内容です。私はそれが誰にでも役立つことを願っています。興味のある友人は、このサイトの他の関連トピックを引き続き参照できます。欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!