思路:
找出k个数据的p次方的和的结果=n,先建立一个数组vc,记录i^p,然后深搜查找所需i^p的最大的个数,
并且更新tmp数组。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
int n,p,k,fg=0,mx=0;
vector <int> vc,ans,tmp;
int power(int x) //计算x的p次方
{
int i,sum=1;
for(i=0;i<p;i++){
sum*=x;
}
return sum;
}
void Init() //初始化小于n的a^p的序列
{
int i=0,y=0;
while(y<=n){
vc.push_back(y);
y=power(++i);
}
}
void dfs(int id,int num,int vc_s,int xl_s) //id表示数据的编号,num代表已经存入数组的数据的个数,vc_s代表a[i]^p+a[i+1]……a[id]共num个元素的和,xl_s代表序列和。
{
if(num==k&&vc_s==n){
fg=1;
if(xl_s>mx){
mx=xl_s;
ans=tmp;
}
return ;
}
if(num>k||vc_s>n) return ; //不符合要求
if(id-1>=0){
tmp.push_back(id); //暂时存入数据
dfs(id,num+1,vc_s+vc[id],xl_s+id); //记录id^p的数据
tmp.pop_back(); //弹出数据
dfs(id-1,num,vc_s,xl_s); //不记录当前,记录下一个数据
}
}
int main(void)
{
int i,j;
cin>>n>>k>>p;
Init();
dfs(vc.size()-1,0,0,0);
if(fg==0) printf("Impossible\n");
else{
printf("%d = ",n);
for(i=0,j=ans.size();i<j;i++){
if(i) printf(" + ");
printf("%d^%d",ans[i],p);
}
}
return 0;
}