DFS遍历
提前使用数组存储p次幂;
//
// main.cpp
// PATA1103
//
// Created by Phoenix on 2018/2/22.
// Copyright © 2018年 Phoenix. All rights reserved.
//
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
int n, k, p;
int num[410] = {0};
int ans = 0;
int optvalue = 0;
vector<int> temp, path;
void DFS(int x, int nowK, int sum, int maxSqu) {
//printf("%d\n", ans);
if(sum == n && nowK == k) {
if(maxSqu > optvalue) {
optvalue = maxSqu;
path = temp;
}
return;
}
if(sum >= n || nowK > k) return;
if(x >= 1) {
temp.push_back(x);
DFS(x, nowK + 1, sum + num[x], maxSqu + x);
temp.pop_back();
DFS(x - 1, nowK, sum, maxSqu);
}
}
int main(int argc, const char * argv[]) {
scanf("%d %d %d", &n, &k, &p);
for(int i = 0; i < 410; i++) {
num[i] = i;
}
for(int i = 1; i < p; i++) {
for(int j = 0; j < 22; j++) {
num[j] *= j;
}
}
int t;
for(int i = 0; i < 22; i++) {
//printf("%d ", num[i]);
if(num[i] > 400) {
t = i - 1;
break;
}
}
DFS(t, 0, 0, 0);
if(path.size() == 0) {
printf("Impossible\n");
} else {
printf("%d = ", n);
for(int i = 0; i < path.size(); i++) {
printf("%d^%d", path[i], p);
if(i < path.size() - 1) printf(" + ");
else printf("\n");
}
}
return 0;
}