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。
运行结果: