题意是A-Z对应1-26,然后给个目标数字和字符串,看看字符串里的某5个字符的组合能不能使v - w^2 + x^3 - y^4 + z^5 = target等式成立,其实多写几个循环也可以达到目的,不过应该会超时,所以还是dfs。
result数组保存最后5个数字,注意要用sort先降序排序,sort默认升序,得加个compare函数,因为本题可能有多解,人家要字典序最大的。num1数组是用来标记该数字被用过没有,注意要memset一下(忘了memset于是每次只能对一组数据也是醉了)。
#include <iostream> #include <algorithm> #include <cstdio> #include <map> #include <string> #include <string.h> #include <queue> #include <vector> using namespace std; int pow(int x,int y) { int z=1; for(;y>0;y--) z*=x; return z; } bool compare(int a,int b) { return a>b; } int num[1000]={0}; int num1[1000]={0}; int result[1000]={0}; char word[10000]; int tar; int len; int dfs(int m,int sum) { if(sum==tar&&m==6) return 1; else if(sum!=tar&&m==6) return 0; else if(m<=5) { for(int i=0;i<len;i++) { if(!num1[i]) { num1[i]=1; result[m]=num[i]; if(m%2==0) { if(dfs(m+1,sum-pow(num[i],m))) return 1;} else { if(dfs(m+1,sum+pow(num[i],m))) return 1;} num1[i]=0; } } } return 0; } int main() { while(scanf("%d%s",&tar,word)!=EOF) { memset(num1,0,sizeof(num1)); if(!strcmp(word,"END")) break; len=strlen(word); for(int i=0;i<len;i++) { num[i]=word[i]-'A'+1; } sort(num,num+len,compare); if(dfs(1,0)) { for(int i=1;i<6;i++) printf("%c",result[i]+'A'-1); printf(" "); } else printf("no solution "); } return 0; }