http://acm.hdu.edu.cn/showproblem.php?pid=1015
题意:给出一个目标值target和一个由大写字母组成的字符串 A-Z分别对应权值1-26
要求从给出的字符串中选出5个字符,它们的权值v,w,x,y,z应符合下列式子
v - w^2 + x^3 - y^4 + z^5 = target
同一个字符只能被选取一次
输出符合要求的5个字符
简单深搜模拟选取操作
# include <stdio.h> # include <string.h> int Target, Len, Ans[6], Flag[20], Value[20]; int Dfs(int Count) { if(Count == 6)//判断选择的5个数是否符合式子 { if(Ans[1] - Ans[2]*Ans[2] + Ans[3]*Ans[3]*Ans[3] - Ans[4]*Ans[4]*Ans[4]*Ans[4] + Ans[5]*Ans[5]*Ans[5]*Ans[5]*Ans[5] == Target) { printf("%c%c%c%c%c\n",Ans[1] + ‘A‘ - 1, Ans[2] + ‘A‘ - 1, Ans[3] + ‘A‘ - 1, Ans[4] + ‘A‘ - 1, Ans[5] + ‘A‘ - 1); return 1; } return 0; } for(int i = 0; i <= Len - 1; i++) { if(Flag[i] == 0) { Flag[i] = 1; Ans[Count] = Value[i]; //依次选取一个数 if(Dfs(Count + 1)) return 1; Flag[i] = 0; } } return 0; } int main () { char str[20]; while(scanf("%d %s",&Target, str) && (Target != 0 || strcmp(str, "END"))) { //str为可选字母表 A-Z对应1-26 memset(Flag, 0, sizeof(Flag)); Len = strlen(str); for(int i = 0; i <= Len - 1; i++) Value[i] = str[i] - ‘A‘ + 1; //按权从小到大排序 for(int i = 0; i <= Len - 2; i++) { for(int j = i + 1; j <= Len - 1; j++) { if(Value[i] < Value[j]) { int t = Value[i]; Value[i] = Value[j]; Value[j] = t; } } } if(!Dfs(1)) printf("no solution\n"); } return 0; }
原文:http://www.cnblogs.com/linjiaman/p/4463594.html