1. 程式人生 > >給定2個數字,n,m,使得從1到n之間的數字組合,他們的和等於m,求所有組合

給定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<n;i++){
			if(arr[i]==1)
				System.out.print("+"+(i+1));
		}
		System.out.println();
		}
}
如果實在沒看懂,請留言。