嘿嘿,题目罗嗦了半天,其实意思很简单,就是给定一个目标值target,再给你一个备选字符串(5~12个字符),要你在这个字符串里选5个出来,满足题中给定的等式,并且你选择的这5个字符组成的字符串必须是所有可能情况中按字典序最大的情况。
简单分析下就可以看出,就是一个组合问题,问题解的最大规模就是12取5,就是12*11*10*9*8*7,而最小规模是5取5,所以应该用枚举法就可以搞定。
不过,枚举之前先排个序,就可以保证输出的是符合要求的最大的那个了
#include<iostream>
#include<string>
using namespace std;
int cmp(const void* a,const void* b)
{
return *(int*)b-*(int*)a;
}
int main()
{
int n,a[15],i,flag;
char s[15];
while(cin>>n>>s)
{
if(n==0&&!strcmp(s,"END"))
break;
for(i=0;s[i]!='\0';i++)
a[i]=s[i]-'A'+1;
qsort(a,i,sizeof(a[0]),cmp);
int len=i;
flag=0;
for(int i=0;i<len;i++)
{
for(int j=0;j<len;j++)
{
if(i==j)continue;
for(int k=0;k<len;k++)
{
if(k==i||k==j)continue;
for(int l=0;l<len;l++)
{
if(l==k||l==i||l==j)continue;
for(int m=0;m<len;m++)
{
if(m==l||m==i||m==j||m==k)continue;
if(a[i]-a[j]*a[j]+a[k]*a[k]*a[k]-a[l]*a[l]*a[l]*a[l]+a[m]*a[m]*a[m]*a[m]*a[m]==n)
{
flag=1;
printf("%c%c%c%c%c\n",a[i]+'A'-1,a[j]+'A'-1,a[k]+'A'-1,a[l]+'A'-1,a[m]+'A'-1);
break;
}
}
if(flag)break;
}
if(flag)break;
}
if(flag)break;
}
if(flag)break;
}
if(!flag)
printf("no solution\n");
}
return 0;
}