题目描述
输入两个整数 n 和 m,从数列1,2,3…n 中随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来
输入描述
每个测试输入包含2个整数,n和m
输出描述
按每个组合的字典序排列输出,每行输出一种组合
解题思路
利用递归思想,假如加到第i个数(sum<m),确定下一个数加还是不加,如果加,如此继续下去,如果不加,回到上一个状态,类似于二叉树递归左右子树
代码如下
import java.util.*;
public class Main{
public static void process(int[] num,int sum,String str,int i,int m){
if(i == num.length){
if(sum == m)System.out.println(str.trim());
return;
}
process(num,sum + num[i],str + num[i] + " ",i+1,m);//加上这个数
process(num,sum,str,i+1,m);//不加这个数
}
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int m = scan.nextInt();
int sum = 0;
String str = "";
int j = 1;
int[] num = new int[n];
for(int i = 0;i < n;i++){
num[i] = j++;
}
process(num,sum,str,0,m);
}
}