回溯3--数的拆分
回溯3--数的拆分
一、心得
二、题目及分析
任意一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和,求总的拆分方法。
这个题目里面原数据数组和标记数组都没有,只有结果数组。
//t是轮数也是ans的位数,print里面输出的时候t要减1,因为判断的时候是在下一轮判断的
三、代码及结果
1 /* 2 任意一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和,求总的拆分方法。 3 4 这个题目里面原数据数组和标记数组都没有,只有结果数组。 5 6 7 */ 8 #include <iostream> 9 using namespace std; 10 11 12 int ans[10001]={1};//储存结果数组 13 int total=0;//方案总数 14 int n; 15 16 void print(int t){ 17 total++; 18 cout<<"<"<<total<<">"<<": "; 19 cout<<n<<"="; 20 for(int i=1;i<t;i++){ 21 cout<<ans[i]<<"+"; 22 } 23 cout<<ans[t]; 24 cout<<endl; 25 } 26 27 //t是轮数也是ans的位数,print里面输出的时候t要减1,因为判断的时候是在下一轮判断的 28 void search(int s,int t){//t是轮数 29 if(s==0) print(t-1); 30 for(int i=ans[t-1];i<=s;i++){ 31 if(i<n){//这句话限制7=7的情况 32 ans[t]=i; 33 search(s-i,t+1); 34 //上一步s-i,s的值没有改变,这一步不用回溯 35 } 36 } 37 } 38 39 int main(){ 40 cin>>n; 41 search(n,1); 42 cout<<total<<endl; 43 return 0; 44 }
版权申明:欢迎转载,但请注明出处
一些博文中有一些参考内容因时间久远找不到来源了没有注明,如果侵权请联系我删除。
在校每年国奖、专业第一,加拿大留学,先后工作于华东师范大学和香港教育大学。
2024-09-05:27岁,宅加太忙,特此在网上找女朋友,vx:fan404006308
AI交流资料群:753014672