标签:url 搜索 16px pac 思路 lse 优先 space ret
写递归最重要的教训,不知道就会导致死循环的。
一般来说,DFS的递归边界即判断条件在第二层递归时才开始起作用,第一层不起作用,第二层的递归边界判断的是第一层数据处理的结果。切记切记!!!
所以在写选择分支时,要处理的是当前参数,而不是下一层递归的参数,
所以在主函数中调用DFS时,填入的参数一般都是 0,一定不要处理数据。
比如这题的分支选择部分,我最开始写的代码如下。
总的来说,这题就是一个简单DFS题,思路很简单,但是我没能写好。啊,我好菜啊!!!
ps:一样套路的题目
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 }
标签:url 搜索 16px pac 思路 lse 优先 space ret
原文地址:https://www.cnblogs.com/keep23456/p/12391384.html