求正整數n所有可能的和式的組合

2021-06-10 08:26:09 字數 1264 閱讀 7552

題目:

給定乙個數字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 首先選取第乙個數...