Note
- DFS
- 超时问题–重写pow函数
- 注意dfs中vector的push与pop!
Code
#include<bits/stdc++.h>
using namespace std;
int n,k,p,maxsum=-1;
vector<int> temp,ans;
int my_pow(int a,int exp){
if(exp==1) return a;
else return a*my_pow(a,exp-1);
}
void dfs(int data,int now_sum,int now_k,int sum_fac){
if(now_k==k&&now_sum==n){
if(sum_fac>maxsum){
maxsum=sum_fac;
ans=temp;
}
return ;
}
if(now_sum>n||now_k>k||data<1) return ;
if(now_sum+my_pow(data,p)<=n){
temp.push_back(data);
dfs(data,now_sum+my_pow(data,p),now_k+1,sum_fac+data);
temp.pop_back();
}
dfs(data-1,now_sum,now_k,sum_fac);
return ;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("data.txt","r",stdin);
#endif
cin>>n>>k>>p;
int data=(int)sqrt(n);
if(k!=1) data-=1;
dfs(data,0,0,0);
if(ans.empty()) printf("Impossible\n");
else{
printf("%d = ",n);
for(int i=0;i<ans.size();i++){
if(i!=0) printf(" + ");
printf("%d^%d",ans[i],p);
}
}
return 0;
}