#include <bits/stdc++.h>
using namespace std;
//FILE *p = fopen("file.txt", "w");
int N, K, P, maxsum = 0, mintop = 20;
stack<int> maxs, s;
stack<int> tmps ,tmpmaxs;
int up;
void dfs(int cnt, int n, int sum, int ans)
{
if (n != 0)
s.push(n);
if (ans > N || n > up || cnt > K || (cnt == K && ans == N && sum < maxsum))
{
s.pop();
return;
}
else if (cnt == K && ans == N && sum >= maxsum)
{
if (s.top() < mintop)
mintop = s.top();
//fprintf(p, "%d %d %d %d\n", cnt, n, sum, ans);
//printf("%d>=%d\n",sum,maxsum);
if (sum > maxsum||maxs.empty())
maxs = s;
else if(sum == maxsum )
{
tmps = s;
tmpmaxs = maxs;
while (tmps.size() > 0)
{
//printf("%d>=%d\n",sum,maxsum);
if(tmps.top() == tmpmaxs.top())
{
//printf("%d==%d\n",tmps.top(),tmpmaxs.top());
tmps.pop();
tmpmaxs.pop();
}
else if (tmps.top() < tmpmaxs.top()){
break;
}
else if (tmps.top() > tmpmaxs.top())
{
maxs = s;
break;
}
}
}
maxsum = sum;
s.pop();
return;
}
//fprintf(p, "%d %d %d %d\n", cnt, n, sum, ans);
if (n == 0)
for (int i = 1; i <= up; i++)
{
if (n + i <= mintop)
dfs(cnt + 1, n + i, sum + n + i, ans + pow(n + i, P));
else
break;
}
else
for (int i = 0; i <= up - n; i++)
{
if (n + i <= mintop)
dfs(cnt + 1, n + i, sum + n + i, ans + pow(n + i, P));
else
break;
}
if (n != 0)
s.pop();
return;
}
int main()
{
scanf("%d%d%d", &N, &K, &P);
up = floor(pow(1.0 * N - K + 1, 1.0 / P));
dfs(0, 0, 0, 0);
if (maxsum == 0)
printf("Impossible\n");
else
{
printf("%d = ", N);
while (maxs.size() > 1)
{
printf("%d^%d + ", maxs.top(), P);
maxs.pop();
}
if (maxs.size() == 1)
printf("%d^%d\n", maxs.top(), P);
}
return 0;
}
测试点2过不了
该博客内容涉及一个C++程序,使用递归搜索找到K个整数的组合,使得这些整数的P次幂之和等于给定的目标值N。程序通过平衡栈来存储中间结果,并在过程中优化解决方案。在满足条件的情况下更新最大和以及最优解。测试点2未能通过,可能需要进一步调试代码以找出问题所在。
356

被折叠的 条评论
为什么被折叠?



