1103 Integer Factorization

写递归最重要的教训,知道就会导致死循环的。

一般来说,DFS的递归边界即判断条件在第二层递归时才开始起作用,第一层不起作用,第二层的递归边界判断的是第一层数据处理的结果。切记切记!!!

所以在写选择分支时,要处理的是当前参数,而不是下一层递归的参数,

所以在主函数中调用DFS时,填入的参数一般都是 0,一定不要处理数据。

比如这题的分支选择部分,我最开始写的代码如下。

 总的来说,这题就是一个简单DFS题,思路很简单,但是我没能写好。啊,我好菜啊!!!

ps:一样套路的题目

深度优先搜索DFS---01背包问题(1)

深度优先搜索DFS---最优子序列求和问题(1)

 1 #include<iostream>
 2 #include<vector>
 3 #include<cmath>
 4 using namespace std;
 5 
 6 int n,k,p,maxfacSum = -1;
 7 vector<int> ans,temp;
 8 
 9 void DFS(int fac,int nowK,int sum,int facSum) {
10     if(sum == n && nowK == k) { //递归边界一
11         if(maxfacSum < facSum) { //更新底数之和
12             ans = temp;
13             maxfacSum = facSum;
14         }
15         return ;
16     }
17     if(fac == 0 || sum > n || nowK > k) return ; //递归边界二
18     temp.push_back(fac);
19     DFS(fac,nowK+1,sum+pow(fac,p),facSum+fac); //“选择”当前因子 
20     temp.pop_back();
21     DFS(fac-1,nowK,sum,facSum); //“不选择” 当前因子,并给出下一个因子 
22 }
23 int main() {
24     cin>>n>>k>>p;
25     DFS(sqrt(n),0,0,0);//初始参数一般都为 0
26     if(maxfacSum == -1)
27         printf("Impossible");
28     else {
29         printf("%d = ",n);
30         for(int i = 0; i < ans.size(); ++i) {
31             if(i > 0) printf(" + ");
32             printf("%d^%d",ans[i],p);
33         }
34     }
35     return 0;
36 }

 

posted @ 2020-03-01 19:13  tangq123  阅读(196)  评论(0编辑  收藏  举报