利用递归算法输出正整数和为n的所有不增的正整数和式。例如当n=5时,不增的和式如下:
5=5
5=4+1
5=3+2
5=3+1+1
5=2+2+1
5=2+1+1+1
5=1+1+1+1+1
形如这种求子集的问题都可以采用回溯法来解决,回溯法即一种加上剪枝判断的递归算法。
解决问题的关键词:不增
代码实现如下:
数组a用来保存分解出来的和数,即某个分解的集合
sum表示需要分解的数
k表示要分解的第k个和数
#include <iostream> #include <stdio.h> using namespace std; #define N 100 void subSetOfSumN(int a[],int sum,int k){ for(int i=sum;i>=1;i--){ if(i<=a[k-1]){ a[k]=i; if(i==sum){ printf("%d=%d",a[0],a[1]); for(int p=2;p<=k;p++) printf("+%d",a[p]); printf("\n"); } else subSetOfSumN(a,sum-i,k+1); } } } int main() { int n,a[N]; printf("Please input an integer n(1<=n<=20):"); scanf("%d",&n); a[0]=n; printf("The result of nonDescend integer factorization is:\n"); subSetOfSumN(a,n,1); return 0; }
时间: 2024-10-12 23:43:01