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 }