输入两个整数 n 和 sum,从数列1, 2, 3, ... , n 中 随意取几个数,使其和等于 sum,要求将其中所有的可能组合列出来.
比如n = 5, sum = 8, 那么所有的组合为:
3 5 或者 1 5 2 或者 1 4 3
思路:
对于一个给定的总和sum, 如果我们从数列的尾部开始,即从n开始,sum 要么等于 n 加上 剩余的1到 n - 1之间的某一个组合,或者 等于 1 到 n-1 之间的某一个组合。
递归的方程为:
findSum(sum, n) = n + findSum(sum - n, n -1) 或者 findSum (sum, n) = findSum (sum, n -1)
----------------------------------------------------------------------
1 #include <iostream> 2 #include <string> 3 #include <list> 4 using namespace std; 5 6 //fun(n,sum)=n+fun(n-1,sum-n); fun(n,sum)=fun(n-1,sum); 7 8 list<int> li; 9 void findsum(int n,int sum){ 10 11 if(n <0 || sum<0) return; 12 if(sum ==0) 13 { 14 if(li.size() == 3) 15 { 16 li.reverse(); 17 for(list<int>::iterator ix =li.begin();ix!=li.end();ix++) 18 cout << *ix <<"\t"; 19 cout << endl; 20 } 21 return; 22 } 23 li.push_back(n); 24 findsum(n-1,sum-n); 25 li.pop_back(); 26 findsum(n-1,sum); 27 28 } 29 30 void main() 31 { 32 int n=9; 33 int sum=15; 34 findsum(n,sum); 35 }