整数A有多少加法表达式
题目: 整数A=a1+a1+a3+…+an (0<a1<=a2<=a3<=…<=an),求集合G={g|g={a1,a2,a3,…,an}}
分析:
1. 求A的表达式,假设已经确定an的值,那么接下来就是求解A-an的表达式。令B=A-an
2. 求B的表达式,假定已经确定bn的值,那么接下来就是求解B-bn的表达式。令C=B-bn
3. 求C的表达式,…
由1-3步可以看出,这是一个递归的过程。那么先看一下,对于求A的表达式,an,bn,cn,…的值的取值范围:
很显然 :1<=an<=A,那么:
1<=bn<=an, 1<=cn<=bn,…
代码:
1: #include<iostream>2: #include<vector>3: #include<algorithm>4:5: using namespace std ;6:7: void print(int x)//output8: {9: cout << x << " " ;
10: }11: void pVector(const vector<int>& iv) //print vector<int>12: {13: for_each(iv.rbegin(),iv.rend(),print) ;14: }15: void _express(int num,int m,vector<int>& iV)
//num:the num need to express
//m: the an’s range can be [1,m]
//iv : used to record the data across the call
16: {17: if(num<m){// num is a1, find the last num in the express
18: if (num){// beacuse a1>0, so to make sure a1!=0
19: print(num);20: //iV.insert(iV.begin(),num) ;
21: }22: pVector(iV) ;23: cout << endl ;24: return ;
25: }26: for(int i=m;i>0;--i){27: iV.push_back(i) ; // chose a num in range [1,m] as an28: _express(num-i,i,iV) ; // an is fined, so to find an-129: iV.pop_back() ; //pop the old an30: }31: }32: void express(int n)33: {34: vector<int> iV ; // used to record the data
35: _express(n,n,iV) ; // n = a1 + a2 + … + an, the max an is n,an in [1,n]36: }