回溯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 } 

回溯3--数的拆分
回溯3--数的拆分