递归实现数字拆分

 

 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。

运行结果:

 

转载于:https://www.cnblogs.com/Marrybe/p/3825618.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值