题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805364711604224

    主要是DFS函数的递归写法,总结一下吧,框架大概就是下面这种

    1. 结果边界
    2. 查找边界
    3. 下次递归
    1. void DFS(int index, int nowk, int sum,...){
    2. //结果边界
    3. if(nowk == k && sum == n){
    4. if(...){//二级筛选
    5. ans = temp
    6. }
    7. }
    8. //查找边界
    9. if(nowk > k || sum > n) return;
    10. //下次递归
    11. temp.push_back(index);
    12. DFS(index, nowk + 1, sum + ..., ...);
    13. temp.pop();
    14. DFS(index - 1, nowk, sum, ...)
    15. }
    16. int main(){
    17. }
    1. #include<vector>
    2. #include<algorithm>
    3. #include<iostream>
    4. #include<cmath>
    5. using namespace std;
    6. vector<int> ans, temp, fac;
    7. int n, k, p, maxFacSum = -1;
    8. void DFS(int index, int nowk, int sum, int facSum){
    9. if(nowk == k && sum == n){//结果边界
    10. if(facSum > maxFacSum){
    11. maxFacSum = facSum;
    12. ans = temp;
    13. }
    14. return;
    15. }
    16. if(nowk > k || sum > n) return;
    17. if(index - 1 >= 0){
    18. temp.push_back(index);
    19. DFS(index, nowk + 1, sum + fac[index], facSum + index);//选
    20. temp.pop_back();
    21. DFS(index - 1, nowk, sum, facSum);//不选
    22. }
    23. }
    24. int main(){
    25. scanf("%d%d%d", &n, &k, &p);
    26. for(int i = 0; pow(i * 1.0, p * 1.0) <= n; i++){//初始化fac数组
    27. fac.push_back(pow(i * 1.0, p * 1.0));
    28. }
    29. DFS (fac.size() - 1, 0, 0, 0);
    30. if(ans.size() == 0){
    31. printf("Impossible");
    32. return 0;
    33. }
    34. printf("%d =",n);
    35. for(int i = 0; i < ans.size(); i++){
    36. printf(" %d^%d", ans[i], p);
    37. if(i != ans.size() - 1) printf(" +");
    38. }
    39. return 0;
    40. }