dfs+剪枝
先把i的p次方存入,再根据这个来判断。
这个思想可以看看
#include<bits/stdc++.h>
using namespace std;
int n,m,k;
int ma=-1;
vector<int> arr;
vector<int> ans,now;
void init(){
int i=2;
int temp=1;
while(temp<=n){
arr.push_back(temp);
temp=(int) pow(i++,k);
}
}
void dfs(int cur,int tol,int cc){
if(now.size()==m && tol==n ){
if(cc>ma){
ma=cc;
ans=now;
}
return;
}
if(tol>n||cur<0|| now.size()>m) return;
now.push_back(cur+1);
dfs(cur,tol+arr[cur],cc+(cur+1));
now.pop_back();
dfs(cur-1,tol,cc);
}
int main(){
cin>>n>>m>>k;
init();
dfs(arr.size()-1,0,0);
if(ma==-1)
printf("Impossible\n");
else{
printf("%d = ",n);
for(int i=0;i<m;i++){
if(i!=0)
printf(" + ");
printf("%d^%d",ans[i],k);
}
printf("\n");
}
return 0;
}