https://www.patest.cn/contests/pat-a-practise/1103
参考了:
http://blog.csdn.net/apie_czx/article/details/48415197
此题不是素数的分解,所以用了搜索,因为k不大,n也不大。
直接用pow(i,p) 会超时
从小到大遍历,如果出现sum相同的(there is a tie),后面的替换前面的。
#include <iostream>
#include <cstdio>
#include <vector>
#include <cmath>
using namespace std;
int n, k, p,maxSum;
vector<int> res;
vector<int> path;
vector<int> powers;
void dfs(int start, int level, int n,int curSum ) {
if (level == k) {
if (n == 0) {
if (curSum >= maxSum) {
res = path;
maxSum = curSum;
}
}
}
else {
int root = sqrt(n);
for (int i = start ; i <= root; i++)
{
if (n - powers[i] < 0) break;
path.push_back(i);
dfs(i, level + 1, n - powers[i], curSum + i );
path.pop_back();
}
}
}
int main()
{
cin >> n >> k >> p;
powers.resize(n+1);
for (int i = 1; i <=n; i++)
{
powers[i] = 1;
for (int j = 1; j <=p; j++)
{
powers[i] = powers[i] * i;
}
}
maxSum = 0;
dfs(1,0, n, 0);
if (res.empty()) printf("Impossible\n");
else {
printf("%d = %d^%d",n,res[k-1],p);
for (int i = k-2; i >=0; i--)
{
printf(" + %d^%d", res[i],p);
}
printf("\n");
}
return 0;
}