题目链接:
题意:输入n,k,p,得出一个等式,这个等式序列要求a[i]+a[i+1]+……+a[j]=max;
思路:
(1)先开始我用for循环模拟,用pow(n,1/p)与k的大小关系判断是否是impossible,但是只有15分,
当时也想过用dfs,但如果要记录每次存的值和总结sum,每次还要进行pow(i,p)就很麻烦,而且可能超时(后来想想,
数据不大,不会超时)。
(2)后来看网上说可以用dfs,但要先记录(打表)i--pow(n,1/p)的p次方,然后进行dfs,每次如果n大于
pow(i,p),就减去它,同时用一个数组记录i,i的和用sum记录,最后如果sum>maxsum,就符合,将b数组的值
赋值给c数组就行了。dfs的结束条件是k==0或者n==0;
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<cmath>
#include<algorithm>
using namespace std;
int maxsum,pp[550],b[120],c[120],len;
void dfs(int n,int tp,int k,int sum,int pos)
{
if(k==0||n==0)
{
if(k==0&&n==0&&sum>maxsum)
{
maxsum=sum;
len=pos;
for(int j=0;j<pos;j++) c[j]=b[j];
}
return ;
}
for(int i=tp;i>=1;i--)
{
if(n>=pp[i])
{
b[pos]=i;
dfs(n-pp[i],i,k-1,sum+i,pos+1);
}
}
}
int main(void)
{
int n,p,k,i,tp;
scanf("%d%d%d",&n,&k,&p);
tp=pow(1.0*n,1.0/p);
for(i=1;i<=tp;i++) pp[i]=pow(i,p);
maxsum=-1;
dfs(n,tp,k,0,0);
if(maxsum==-1) printf("Impossible\n");
else
{
printf("%d = ",n);
for(i=0;i<len-1;i++) printf("%d^%d + ",c[i],p);
printf("%d^%d\n",c[i],p);
}
return 0;
}