未能全部通过,分数是29分。少一分。
代码如下,解法思路见书上。
#include <iostream>
#include <vector>
#include <cstdio>
using namespace std;
int n,k,p;
vector<int> fac,temp,ans;
int pow(int a)
{ int x=1;
for(int i=0;i<p;i++)
{
x=x*a;
}
return x;
}
void init(){
int i=0,temp=0;
while(pow(i)<n){
temp=pow(i);
fac.push_back(temp);
i++;
}
}
int maxsumfac=-1;
void DFS(int index,int nowk, int sum,int sumfac)
{
if(nowk==k&&sum==n){
if(sumfac>maxsumfac){
ans=temp;
maxsumfac=sumfac;
}
return;
}
if(nowk>k||sum>n){
return;
}
if(index>=1){
temp.push_back(index);
DFS(index,nowk+1,sum+fac[index],sumfac+index);
temp.pop_back();
DFS(index-1,nowk,sum,sumfac);//我开始写的是nowk+1,导致出错!
}
}
int main()
{
scanf("%d %d %d",&n,&k,&p);//输入格式非常的严格!
init();
DFS(fac.size()-1,0,0,0);
if(maxsumfac==-1){
printf("Impossible\n");
}else{
printf("%d = %d^%d",n,ans[0],p);
for(int i=1;i<ans.size();i++){
printf(" + ");
printf("%d^%d",ans[i],p);
}
}
}