print解法

lsmepo6l  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(327)

我有一个任务,写一个程序,接收一个介于 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;
}
5ssjco0h

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
要处理重复项,请检测重复项并只考虑一次。例如,当您添加到中间的数字时,会考虑到一个重复的数字,而不是添加到最右边的数字时。

py49o6xq

py49o6xq2#

你可以使用 List<List<Integer>> 以确保不会打印重复出现的内容。无论何时打印一行,添加 List.of(x1, x2, x3) 并通过返回 1 .
演示:

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        System.out.println(solutions(5));
    }

    public static int solutions(int num) {
        if (num < 3 || num > 30)
            return 0;
        return solutions(num, 1, 1, 1, new ArrayList<>());
    }

    public static int solutions(int num, int x1, int x2, int x3, List<List<Integer>> list) {
        if (x1 + x2 + x3 == num) {
            if (!list.contains(List.of(x1, x2, x3))) {
                list.add(List.of(x1, x2, x3));
                System.out.println(x1 + " + " + x2 + " + " + x3);
                return 1;
            }
            return 0;
        }
        return solutions(num, x1 + 1, x2, x3, list) + solutions(num, x1, x2 + 1, x3, list)
                + solutions(num, x1, x2, x3 + 1, list);
    }
}

输出:

3 + 1 + 1
2 + 2 + 1
2 + 1 + 2
1 + 3 + 1
1 + 2 + 2
1 + 1 + 3
6

相关问题