4 回答

TA貢獻1963條經驗 獲得超6個贊
你得到重復的原因是兩者solutions(1,2,1)都會solutions(2,1,1)引導你到2 + 2 + 1.
不重復三位數的簡單方法是從 111 遞增到 10,10,10,就好像它是一個十進制整數一樣:
private static int solutions(int num, int x1, int x2, int x3)
{
if (x1 > 10 || x1 > num)
return 0;
if (x2 > 10 || x1+x2 > num)
return solutions(num, x1+1, 1, 1);
if (x3 > 10 || x1+x2+x3 > num)
return solutions(num, x1, x2+1, 1);
int me = 0;
if (x1+x2+x3 == num) {
System.out.printf("%d + %d + %d\n", x1, x2, x3);
me=1;
}
return me + solutions(num, x1, x2, x3+1);
}
這模仿了您通過修剪搜索整個空間的方法,但更有效的解決方案可以只搜索x1和x2并設置x3=num-x1-x2。

TA貢獻1883條經驗 獲得超3個贊
我們可以使用字符串來解決這個問題。聲明一個全局字符串變量
static String str=""; // taken null intially
現在,我們可以使用這個字符串 str 來存儲序列并檢查它是否已經出現在前面。這樣我們就可以跟蹤重復的問題,您將得到答案。我已附上我的代碼如下。
private static int solutions(int num, int x1, int x2, int x3)
{
if (x1 < 1 || x1 > 10 || x2 < 1 || x2 > 10||x3 < 1 || x3 > 10)
return 0;
if (x1 + x2 + x3 > num)
return 0;
if (x1 + x2 + x3 == num)
{
String s= String.valueOf(x1)+"+"+String.valueOf(x2)+"+"+String.valueOf(x2);
if(!str.contains(s))
{
str=str+s+"\n";
System.out.println(x1 + " + " + x2 + " + " + x3);
return 1;
}
}
return solutions(num, x1 + 1, x2, x3) + solutions(num, x1, x2 + 1, x3) + solutions(num, x1, x2, x3 + 1);
}

TA貢獻1825條經驗 獲得超6個贊
好吧......沒有集合,沒有全局變量,沒有重復項。我希望你被允許使用 StringBuilder?
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
System.out.println("num of solutions: " + solutions(5, sb));
System.out.println(sb.toString());
}
public static int solutions(int num, StringBuilder sb) {
if (num < 3 || num > 30)
return 0;
return solutions(num, 1, 1, 1, sb);
}
private static int solutions(int num, int x1, int x2, int x3, StringBuilder sb) {
if (x1 > 10 || x2 > 10 || x3 > 10) {
return 0;
}
if (x1 + x2 + x3 > num) {
return 0;
}
if (x1 + x2 + x3 == num) {
String str = x1 + " + " + x2 + " + " + x3;
if (!sb.toString().contains(str)) {
sb.append(str).append(System.lineSeparator());
return 1;
}
}
return solutions(num, x1 + 1, x2, x3, sb)
+ solutions(num, x1, x2 + 1, x3, sb)
+ solutions(num, x1, x2, x3 + 1, sb);
}
結果:
num of solutions: 6
3 + 1 + 1
2 + 2 + 1
2 + 1 + 2
1 + 3 + 1
1 + 2 + 2
1 + 1 + 3

TA貢獻1810條經驗 獲得超5個贊
試試這個 :
public static void main(String... args) {
System.out.println(solutions(5));
}
public static int solutions(int n) {
if (n < 3 || n > 30) return 0;
return solutions(n, n-2, 1, 1, 0);
}
public static int solutions(int n, int x1, int x2, int x3, int solutions) {
++solutions;
System.out.println("Solution found : "+x1 +"+" + x2 + "+" + x3);
if(x3 == n-2) return solutions;
if(x2 > 1) {
return solutions(n, x1, x2-1, x3+1, solutions);
}
if(x1 > 1) {
return solutions(n, x1-1, n-x1, 1, solutions);
}
return solutions;
}
輸出:6
這個想法如下:
您從盡可能大的 x1 開始。
然后你遵循這兩個規則:
如果 x2 > 1 則 x2 = x2 - 1 且 x3 = x3 + 1
如果不是,并且如果 x1 > 1 THEN x1 = x1 - 1,x3 = 1 和 x2 = 獲得正確總數所需的數量。
如果這兩個條件都不成立,則沒有更多的解決方案。
結果 :
3 + 1 + 1
第一個條件為假,第二個條件為真:我們將 1 移至 x1,x3 變為 1,x2 變為邏輯上的 2
2 + 2 + 1
第一個條件為真。我們從 x2 中刪除 1,然后將 1 添加到 x3
2 + 1 + 2
第一個條件為假
第二個條件為真
1 + 3 + 1
第一個條件為真
1 + 2 + 2
第一個條件為真
1 + 1 + 3
第一個條件為假,第二個為假。
我們有 6 個解決方案,就是這樣。
希望有所幫助!
添加回答
舉報