2010年中兴面试题
编程求解:
输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数,
使其和等于 m ,要求将其中所有的可能组合列出来.
编程求解:
输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数,
使其和等于 m ,要求将其中所有的可能组合列出来.
解题思路:
乍一看还是挺吓人的...仔细想一下,在任意一个组合中,数列中的每一个数字都只有两种情况,加入组合或者不加入组合..这样我们可以从第一个数字开始递归,第一个数字有两种情况,加入或不加入,然后根据不同的情况改变递归条件,达到递归终止条件的时候就可以输出结果..
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
public class Q21 {
public static void getResult(int now,int n,int m,ArrayList<Integer> record,int sum) //now代表递归到now的时候
{
if(sum == m) //达到递归条件,输出
{
System.out.println(record.toString());
return;
}
if(now > n || sum > m) //超出递归条件或者再往下递归也没有什么必要了,就终结递归
return;
if(sum < m)
{
getResult(now+1, n, m, record, sum); //该数字不加入组合
if(now != 0)
{
record.add(now);
getResult(now+1, n, m, record, sum+now); //该数字加入组合
record.remove(record.size()-1);
}
}
}
public static void main(String[] args) throws Exception {
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
System.out.println("Input m:");
int m = Integer.parseInt(br.readLine());
System.out.println("Input n:");
int n = Integer.parseInt(br.readLine());
int sum = 0;
ArrayList<Integer> record = new ArrayList<Integer>();
getResult(0, n, m, record, sum);
}
}