题目
输入两个整数 n 和 m,从数列1,2,3…n 中随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来
输入描述:
每个测试输入包含2个整数,n和m
输出描述:
按每个组合的字典序排列输出,每行输出一种组合
示例1
输入
5 5
输出
1 4
2 3
5
分析
假设问题的解为F(n, m),可分解为两个子问题 F(n-1, m-n)和F(n-1, m)。对这两个问题递归求解,求解过程
中,如果找到了符合条件的数字组合,则打印出来 例如 1, 2, 3, 4, 5, 求有多少中组合和为 5 对于 1 这个元素
来说, 可能会放到结果中, 可能不放到结果中 如果放到结果中, 就相当于求 2…5 中取若干个数字和为 4. (即为
F(n-1, m-n)) 如果不放到结果中, 就相当于求 2…5 中取若干个数字和为 5. (即为F(n-1, m))
代码
import java.util.ArrayList;
import java.util.Scanner;
public class Main{
static ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>()