題目:
給定乙個數字n,求解出所有和為n的整數組合,要求組合按照遞增方式展示,而且唯一。
分析:最初看到這個題,沒有什麼特別好的思路,後來看了下別人的帖子,其實問題也沒那麼難,採用遞迴的方式進行求解,比如我們需要計算和為4的所有組合,我們首先將小於等於4的所有數字列出來
1,2,3,4
首先選取第乙個數字,我們選取1,這時候,餘下的和為(4-1),我們繼續從1,2,3,4中選擇,如此遞迴下去
第二次,我們選擇1後面的數字,也就是2,作為第乙個數字,餘下的和為(4-2),我們繼續從2,3,4中選擇和為2的組合,注意,這裡是從2,3,4中選取,而不是1,2,3,4中選取,如果採用後者方式,我們得到的結果會存在重複組合,比如1,1,2和2,1,1。
**如下:
/*
* combinationfornumber.cpp
* * created on: 2012-10-19
*/#include #include #include #include using namespace std;
#define max_value 20
int next[max_value] = ; //可以理解成乙個鍊錶,next[i]表示i數後面跟著的數字
/* * 遞迴進行求解
* @nsum 目標和
* @pdata 儲存已經存在的數字
* @ndepth 記錄當前已經儲存資料的個數
*/void segnum(int nsum, int* pdata, int ndepth)
//這裡有乙個小trick,如果要求呈現遞增,採用第一種賦值方式
//如果可以是重複的,即非遞增方式,採用第二種賦值
int i = (ndepth == 0 ? next[0] : pdata[ndepth - 1]);
//int i = next[0];
for (; i <= nsum;)
return ;
}void showresult(int array, int nlen)
int main()
//找零錢測試
showresult(array, max_value);
//system("pause");
return 0;
}
****:
我新增了一些注釋,注意在這個**中,作者用next陣列來模擬鍊錶
總結:
如果沒有很好的思路,我們採用遞迴方式,分而治之,將問題一步一步減小。
求正整數n所有可能的和式的組合
求正整數n所有可能的和式的組合 如 4 1 1 1 1 1 1 2 1 3 2 1 1 2 2 首先說一下,群裡面很多人在問這個東東怎麼去列印,當然如果是只求組合個數的話,他就是乙個完全揹包的問題,如果要列印的話,那還真的費一番功夫。我們可以將這題想為乙個找零錢問題,以前找零錢問題是,我們有1元 2...
求正整數n所有可能的和式的組合
問題背景 求正整數n所有可能的和式的組合 如 4 1 1 1 1 1 1 2 1 3 2 1 1 2 2 對於這個題目有兩種理解了 一 如果將1 1 2和2 1 1當成不同的序列的話,這個問題會相對容易些。拿n 4這個例子,首先最長的組合肯定是4 1 1 1 1,那麼最短的組合是4 4,到最後可能會...
求正整數n所有可能的和式的組合
題目 給定乙個數字n,求解出所有和為n的整數組合,要求組合按照遞增方式展示,而且唯一。分析 最初看到這個題,沒有什麼特別好的思路,後來看了下別人的帖子,其實問題也沒那麼難,採用遞迴的方式進行求解,比如我們需要計算和為4的所有組合,我們首先將小於等於4的所有數字列出來 1,2,3,4 首先選取第乙個數...