暴力搜索。
#include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<map> #include<queue> #include<stack> #include<algorithm> using namespace std; int n,k,p,top; int path[1000]; int flag=0; int ans_path[1000],ans_num=0,ans_len; void dfs(int x,int pre,int sum,int num) { if(sum>n) return; if(x>k) return; if(sum==n) { if(x!=k) return; flag=1; if(num>ans_num) { ans_num=num; ans_len=x; for(int i=0;i<x;i++) ans_path[i]=path[i]; } return; } for(int i=pre;i>=1;i--) { path[x]=i; dfs(x+1,i,sum+int(pow(i,p)+0.5),num+i); } } int main() { scanf("%d%d%d",&n,&k,&p); top=(int) (pow(1.0*n,1.0/p)+0.5); top=min(top,n/k); //加这个剪枝速度还可以提高一些 dfs(0,top,0,0); if(flag==0) printf("Impossible "); else { printf("%d = ",n); for(int i=0;i<ans_len;i++) { printf("%d^%d",ans_path[i],p); if(i!=ans_len-1) printf(" + "); } } return 0; }