递归实现数字拆分

 

 1 #include<iostream>
 2 #include<string>
 3 #include<algorithm>
 4 #include<vector>
 5 #include<cmath>
 6 #include<set>
 7 using namespace std;
 8 
 9 void splitnum(int n, int k, int &way, vector<int> ans) //对n进行拆分,拆分数的最小值为k
10 {
11     if((n>=k && n<2*k) || n==0)
12     {
13         way++;
14         if(n!=0)
15             ans.push_back(n);
16 
17         cout<<"way "<<way<<":"<<endl;
18         for(unsigned j=0; j<ans.size(); j++)
19             cout<<ans[j]<<" ";
20         cout<<endl;
21 
22         return;
23     }
24 
25     for(int i=k; i<=n; i++)
26     {
27         ans.push_back(i);
28 
29         if(n-i>=i || n-i==0)
30             splitnum(n-i, i, way, ans);
31 
32         ans.pop_back();
33 
34     }
35 }
36 
37 int main()
38 {
39     int T,n;    
40     cin>>T;
41 
42     for(int i=0; i<T; i++)
43     {
44         cin>>n;
45         int way=0;
46         splitnum(n, 1, way, vector<int>());
47         cout<<way<<endl;
48     }
49 
50     return 0;
51 }

代码中包含了拆分的结果显示部分,题目中只需输出拆分种类数即可,对于给出的三个测试样例结果正确,其他结果有待验证,并且用递归实现非常耗时,提交后出现TLE。

运行结果:

 

posted @ 2014-07-05 12:10  Marrybe  阅读(969)  评论(0编辑  收藏  举报