题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805364711604224
主要是DFS函数的递归写法,总结一下吧,框架大概就是下面这种
- 结果边界
- 查找边界
- 下次递归
void DFS(int index, int nowk, int sum,...){//结果边界if(nowk == k && sum == n){if(...){//二级筛选ans = temp}}//查找边界if(nowk > k || sum > n) return;//下次递归temp.push_back(index);DFS(index, nowk + 1, sum + ..., ...);temp.pop();DFS(index - 1, nowk, sum, ...)}int main(){}
#include<vector>#include<algorithm>#include<iostream>#include<cmath>using namespace std;vector<int> ans, temp, fac;int n, k, p, maxFacSum = -1;void DFS(int index, int nowk, int sum, int facSum){if(nowk == k && sum == n){//结果边界if(facSum > maxFacSum){maxFacSum = facSum;ans = temp;}return;}if(nowk > k || sum > n) return;if(index - 1 >= 0){temp.push_back(index);DFS(index, nowk + 1, sum + fac[index], facSum + index);//选temp.pop_back();DFS(index - 1, nowk, sum, facSum);//不选}}int main(){scanf("%d%d%d", &n, &k, &p);for(int i = 0; pow(i * 1.0, p * 1.0) <= n; i++){//初始化fac数组fac.push_back(pow(i * 1.0, p * 1.0));}DFS (fac.size() - 1, 0, 0, 0);if(ans.size() == 0){printf("Impossible");return 0;}printf("%d =",n);for(int i = 0; i < ans.size(); i++){printf(" %d^%d", ans[i], p);if(i != ans.size() - 1) printf(" +");}return 0;}
