版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhaohaibo_/article/details/88753500
题目大意:给顶正整数N、K、P,将N表示成K个正整数(可以相同,递减排列)的P次方的和
思路:
首先求出所有不同底数时P次幂的数,存在fac[]中
枚举fac数组,对于每个元素可多次选取
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
int N, P, K; // N表示成K个正整数的P次方的和
vector<int> fac;
vector<int> ans, temp;
int facsize, maxfacsum = -1;
void dfs(int curpos, int k, int sum, int facsum)
{
if (sum > N || k > K)
return;
if (sum == N && k == K)
{
if (facsum > maxfacsum)
{
ans = temp;
maxfacsum = facsum;
}
return;
}
// if (curpos == 0) return;
//选当前数
if (curpos - 1 >= 0)
{
temp.push_back(curpos);
dfs(curpos, k + 1, sum + fac[curpos], facsum + curpos);
temp.pop_back();
dfs(curpos - 1, k, sum, facsum);
}
}
int main()
{
cin >> N >> K >> P;
int i = 0, temp = 0;
while (temp <= N)
{
fac.push_back(temp);
temp = pow(++i, P);
}
facsize = fac.size();
dfs(facsize - 1, 0, 0, 0);
if (maxfacsum == -1)
cout << "Impossible" << endl;
else
{
cout << N << " = " << ans[0] << "^" << P;
for (int i = 1; i < ans.size(); i++)
cout << " + " << ans[i] << "^" << P;
}
return 0;
}