我有一个任务,写一个程序,接收一个介于 3
以及 30
返回方程的解数 x1+x2+x3 = num
,在哪里 x1
, x2
,和 x3
数字介于 1
以及 10
.
它还打印这些解决方案。例如 num=5
它回来了 6
并打印以下内容:
1 + 1 + 3
1 + 2 + 2
1 + 3 + 1
2 + 1 + 2
2 + 2 + 1
3 + 1 + 1
我被要求使用递归。
问题的复杂性并不重要。我想我成功地做到了这一点,复杂性为3^n(这是可怕的)。但是,它也有相同的答案被多次计数,所以这是一个无效的答案。
public static int solutions(int num) {
if (num <3 || num > 30)
return 0;
return solutions(num, 1, 1, 1);
}
public static int solutions(int num, int x1, int x2, int x3) {
if (x1 > 10 || x2 > 10 || x3 > 10)
return 0;
int count, val1, val2, val3;
if (x1 + x2 + x3 == num) {
System.out.println(x1+" + "+x2+" + "+x3);
count = 1;
} else
count = 0;
val1 = solutions(num, x1+1, x2, x3);
val2 = solutions(num, x1, x2+1, x3);
val3 = solutions(num, x1, x2, x3+1);
return count + val1 + val2 + val3;
}
2条答案
按热度按时间5ssjco0h1#
我将使用的算法是从以下几点开始:
n-2 1 1
然后我会采取分而治之的办法。基本上,改变上述组合的最简单方法是从第一个组合中取一个,然后将一个添加到第二个或第三个组合中,这样就可以得到可能的结果
n-3 2 1
或
n-3 1 2
你总是从第一个元素中选取一个元素,并且你总是正好有两个案例。所以,病例数大概是(n-2)^2。我说“大致”,因为会有一些重复,例如
1 2 2
都可以从
2 1 2
来自
2 2 1
要处理重复项,请检测重复项并只考虑一次。例如,当您添加到中间的数字时,会考虑到一个重复的数字,而不是添加到最右边的数字时。
py49o6xq2#
你可以使用
List<List<Integer>>
以确保不会打印重复出现的内容。无论何时打印一行,添加List.of(x1, x2, x3)
并通过返回1
.演示:
输出: