编程求解,输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m。要求将所有的可能组合列出来。
思路:
1.首先判断,如果n>m,则n中大于m的数不可能参与组合,此时置n = m;
2.将最大数n加入且n == m,则满足条件,输出;
3.将n分两种情况求解,
(1)n没有加入,取n = n - 1; m = m;递归下去;
(2)n加入,取n = n - 1, m = m - n,递归下去
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
public class Demo{
private static List<Integer> list = new ArrayList<>();
private static List<List<Integer>> res = new ArrayList<>();
public static void findSum(int sum, int n) {
if (n < 1 || sum < 1)
return;
if (sum <= n) {//注意是小于等于
list.add(sum); // sum < n ,直接加入sum可以满足了
res.add(new LinkedList<>(list));
list.remove(list.size() - 1);
// count++;//求个数
return;
}
list.add(n);
findSum(sum - n, n - 1);// n加入,取n=n-1,sum=sum-n
list.remove(list.size() - 1);
findSum(sum, n - 1); // n没有加入,取n=n-1,sum=sum
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
int n = scanner.nextInt();//n
int sum = scanner.nextInt();//m
findSum(sum, n);
System.out.println(res);
//System.out.println(count);
//count = 0; //求符合条件的个数
res = new ArrayList<>();//重置res list
}
}
}