我有一個難題,我需要通過刪除一些條件中的17來減少一個數字爲零。以下是您理解的難題。最快的硬幣移動
從138個硬幣開始,找到最少移動次數達到0個硬幣。隨着每一步你可以(a)丟棄17個硬幣,(b)丟棄1個硬幣或(c)丟棄一半硬幣(但只有當你有偶數個硬幣時)。編寫一個程序,測試所有可能的移動組合並打印最快移動組合所需的移動次數。
我發現使用下面的代碼最快的移動。現在,我需要找出其他可能的動作,但我堅持下去。有人能幫忙嗎?
package com.infy.cis.test;
public class CoinMovementPuzzle {
static int times=0;
public static void main(String[] args) {
// TODO Auto-generated method stub
numDiv(138,2,17,1);
}
public static void numDiv(int a, int b,int c,int d) {
if(a!=0)
{
int remainder=a%b;;
if(remainder==0 && a>=2)
{
evenNumber(a,b);
}
else if(remainder!=0 && a>=17)
{
oddNumber17(a,c);
}
else
{
oddNumber1(a,d);
}
}
System.out.println("FINAL"+times);
}
private static void oddNumber1(int a,int d) {
// TODO Auto-generated method stub
a=a-d;
times=times+1;
System.out.println("odd number::"+a+"::"+times);
numDiv(a, 2,17,1);
}
private static void oddNumber17(int a,int c) {
// TODO Auto-generated method stub
//int rem;
int rem=a%c;
a/=c;
times=times+a;
System.out.println("odd number::"+a+"::"+times);
numDiv(rem, 2,17,1);
}
private static void evenNumber(int a,int b) {
// TODO Auto-generated method stub
a/=2;
times=times+1;
//System.out.println(a/=b);
//remainder=a%b;
System.out.println("Value of a"+a);
System.out.println("even number::"+a+"::"+times);
numDiv(a, 2,17,1);
}
}
從格式化您的代碼開始,然後請告訴我們您卡在哪裏以及您嘗試了什麼。 – Thomas
http://stackoverflow.com/questions/29780471/java-program-for-fastest-coin-move-combination –
我認爲你要找的是[廣度優先搜索](http://en.wikipedia .ORG /維基/廣度first_search)。創建一棵樹,其中第一次移動是一半,17和1.這創建了3個節點。對於每個節點,使用合法移動創建新節點。當你創建了所有的節點時(換句話說,當你的所有子節點都是零)時,你已經創建了一個包含所有移動組合的樹。 –