码迷,mamicode.com
首页 > 其他好文 > 详细

1103 Integer Factorization

时间:2020-03-01 19:40:53      阅读:65      评论:0      收藏:0      [点我收藏+]

标签:url   搜索   16px   pac   思路   lse   优先   space   ret   

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

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

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

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

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

技术图片

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

ps:一样套路的题目

深度优先搜索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(fac == 0 || sum > n || nowK > k) return ;
11     if(sum == n && nowK == k) {
12         if(maxfacSum < facSum) { //更新底数之和
13             ans = temp;
14             maxfacSum = facSum;
15         }
16         return ;
17     }
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); //DFS初始参数
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 }

技术图片

 

1103 Integer Factorization

标签:url   搜索   16px   pac   思路   lse   优先   space   ret   

原文地址:https://www.cnblogs.com/keep23456/p/12391384.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!