自己的方法总是不对,参考了大佬的
#include<stdio.h>
#include<iostream>
#include<string>
#include<vector>
#include<string.h>
#include<set>
#include<math.h>
#include<map>
#include<algorithm>
#include<queue>
using namespace std;
#define N 405
int n, k, p;
int fidx = 0;
int factor[N];
int res[N];
int ans[N];
int maxsum = 0;
bool flag = false;
void dfs(int num, int cnt, int sum, int last) {
if (num == 0 && cnt == 0) {
if (sum>maxsum) {
flag = true;
for (int i = 1; i <= k; i++)
ans[i] = res[i];
maxsum = sum;
}
return;
}
else if (cnt == 0)
return;
for (int i = min(fidx - 1, last); i >= 0; i--) {
int left = num - factor[i];
if (left >= cnt - 1) {
res[cnt] = i + 1;
dfs(left, cnt - 1, sum + i + 1, i);
}
}
}
int main()
{
scanf("%d %d %d", &n, &k, &p);
int tmp = 1;
fidx = 0;
while (tmp <= n) {
factor[fidx] = tmp;
fidx++;
tmp = pow(fidx + 1, p);
}
int cnt = 0;
int last = fidx - 1;
dfs(n, k, 0, last);
if (flag) {
printf("%d =", n);
for (int i = k; i >= 2; i--) {
printf(" %d^%d +", ans[i], p);
}
printf(" %d^%d", ans[1], p);
}
else {
printf("Impossible");
}
return 0;
}