求正整数n所有可能的和式的组合

来源:互联网 发布:淘宝网首页女装秋装 编辑:程序博客网 时间:2024/05/16 14:47

求正整数n所有可能的和式的组合(如;4=1+1+1+1、1+1+2、1+3、2+1+1、2+2)

 

首先说一下,群里面很多人在问这个东东怎么去打印,当然如果是只求组合个数的话,他就是一个完全背包的问题,如果要打印的话,那还真的费一番功夫。

我们可以将这题想为一个找零钱问题,以前找零钱问题是,我们有1元、2元、5元、10元面值的纸币,现在我有20元钱,问有多少种找法。

 

这个找零钱如果将面值扩展为1元、2元、3元....20元,那么就刚好是我们这道题了。

请看我另一篇blog《找零钱递归》

我直接贴代码如下:

#include <iostream>#include <string.h>using namespace std;#define MAX_VALUE10int next[MAX_VALUE] = {0};void SegNum(int nSum, int* pData, int nDepth){if(nSum < 0)return;if(nSum == 0){for(int j = 0; j < nDepth; j++)cout << pData[j] << " ";cout << endl;return;}int i = (nDepth == 0 ? next[0] : pData[nDepth-1]);for(; i <= nSum;){pData[nDepth++] = i;SegNum(nSum-i,pData,nDepth);nDepth--;i = next[i];}}void ShowResult(int array[],int nLen){next[0] = array[0];int i = 0;for(; i < nLen-1; i++)next[array[i]] = array[i+1];next[array[i]] = array[i]+1;int* pData = new int [MAX_VALUE];SegNum(MAX_VALUE,pData,0);delete [] pData;}
测试代码如下:

int main(){int* array = new int[MAX_VALUE];for(int i = 0; i < MAX_VALUE; i++){array[i] = i+1;}//找零钱测试ShowResult(array,MAX_VALUE);system("pause");return 0;}
测试结果如下:



原创粉丝点击