从1到n中找到任意num个数的和为sum的所有组合

输入两个整数 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 } 

 

posted on 2012-09-04 11:43  笔记吧... 可能只有自己看得懂  阅读(1016)  评论(0编辑  收藏  举报