给定2个数字,n,m,使得从1到n之间的数字组合,他们的和等于m,求所有组合

这个题目也是非常经典的问题,把一个数字分解成多个数字的组合之和,问有多少种可能,并输出。

微软比赛题目,对于这类题目,最为简单的版本就是,给定一个排好序的数字,求,这个数组中的任意两个数字之和,等于给定的值。

这个就相对比较,简单,2个指针,移动他们的位置,和比给定的大,指针往前挪动,否则,另外一个指针往后挪动。

然后,这个是2个数字的情况,那么多个数字怎么考虑??

如下,具体的测试,看上篇文章,这里主要是把程序粘贴了出来。

强调一句,如果,你能理解里面的那个2个递归(helper),他们之间的关系,以及下标i的变化,我只能说你真的明白,递归的过程了,否则,确实不好理解。

class Test1{
	void findAllAnswer(int n,int dest){
		int[]arr=new int[n];
		helper(dest,0,arr,n);
	}

	private void helper(int dest, int i,int[] arr , int n) {
		// TODO Auto-generated method stub
		if(dest==0)
			prints(arr,n);
		if(dest<=0||i==n) return;
			helper(dest,i+1,arr,n);
		arr[i]=1;
		helper(dest-i-1,i+1,arr,n);
		arr[i]=0;
	}

	private void prints(int[] arr, int n) {
		// TODO Auto-generated method stub
		for(int i=0;i
如果实在没看懂,请留言。

你可能感兴趣的:(算法)