嘿嘿,题目罗嗦了半天,其实意思很简单,就是给定一个目标值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; }