給定2個數字,n,m,使得從1到n之間的數字組合,他們的和等於m,求所有組合
阿新 • • 發佈:2019-02-03
這個題目也是非常經典的問題,把一個數字分解成多個數字的組合之和,問有多少種可能,並輸出。
微軟比賽題目,對於這類題目,最為簡單的版本就是,給定一個排好序的數字,求,這個陣列中的任意兩個數字之和,等於給定的值。
這個就相對比較,簡單,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(); } }