题目是说给出一个数字,然后再给出一行字母,其中字母按字母表的顺序代表相应的数字(A=1, B=2, ..., Z=26),问如何在这一行字母中筛选出5个字母,使得满足等式v - w^2 + x^3 - y^4 + z^5 = target(target就是你输入的数字),组合按字典序大的在前进行排列。既然是要筛选出合理的情况,那就是要从大到小遍历一遍,直接DFS就能过,也没什么特殊的剪枝,注意下在字母输入完之后进行一下排序,一开始没排序结果出来的和样例不一样= =
然后,放代码吧= =
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
char s[105],ans[10];
int a[105],res[10];
int N,k,t;
bool part[105];
bool target(int v,int w,int x,int y,int z)
{
int temp;
temp=v-w*w+x*x*x-y*y*y*y+z*z*z*z*z;
if(temp==N)
return 1;
else
return 0;
}
int dfs(int step)
{
int i,j;
if(t==1)
return 0;
if(step==5)
{
if(target(res[0],res[1],res[2],res[3],res[4])==1)
{
t=1;
for(i=0;i<5;i++)
{
ans[i]=res[i]+'A'-1;
}
return 0;
}
}
else
{
for(i=k-1;i>=0;i--)
{
if(!part[i])
{
part[i]=1;
res[step]=a[i];
dfs(step+1);
part[i]=0;
}
}
}
return 0;
}
int main()
{
int i;
while(scanf("%d",&N)!=EOF)
{
scanf("%s",s);
if(N==0&&strcmp(s,"END")==0)
break;
t=0;
memset(part,0,sizeof(part));
k=strlen(s);
for(i=0;i<k;i++)
{
a[i]=s[i]-'A'+1;
}
sort(a,a+k);
dfs(0);
if(t==0)
cout<<"no solution"<<endl;
else
cout<<ans[0]<<ans[1]<<ans[2]<<ans[3]<<ans[4]<<endl;
}
return 0;
}