题目:字母'A'~'Z'对应数值1~26,现在给你一个字母表和target,从里面选取5个字母v、w、x、y、z,
使得公式v - w^2 + x^3 - y^4 + z^5 = target成立,找到字典序最大的vwxyz。
分析:简单题、搜索。因为一定选取5个元素,所以直接暴力即可(模拟递归)。
说明:计算时标记取过的字母,避免重复计算。
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
char table[13];
int visit[13];
int value(int v, int w, int x, int y, int z)
{
v = table[v]-'A'+1; w = table[w]-'A'+1;
x = table[x]-'A'+1; y = table[y]-'A'+1; z = table[z]-'A'+1;
return v - w*w + x*x*x - y*y*y*y + z*z*z*z*z;
}
int main()
{
int target;
while (~scanf("%d%s",&target,table) && target) {
int flag = 0,len = strlen(table);
sort(table, table+len);
for (int v = len-1 ; v >= 0 ; -- v) {
visit[v] = 1;
for (int w = len-1 ; w >= 0 ; -- w) if (!visit[w]) {
visit[w] = 1;
for (int x = len-1 ; x >= 0 ; -- x) if (!visit[x]) {
visit[x] = 1;
for (int y = len-1 ; y >= 0 ; -- y) if (!visit[y]) {
visit[y] = 1;
for (int z = len-1 ; z >= 0 ; -- z) if (!visit[z]) {
if (value(v, w, x, y, z) == target) {
printf("%c%c%c",table[v],table[w],table[x]);
printf("%c%c\n",table[y],table[z]);
flag = 1;break;
}
}visit[y] = 0; if (flag) break;
}visit[x] = 0; if (flag) break;
}visit[w] = 0; if (flag) break;
}visit[v] = 0; if (flag) break;
}
if (!flag) printf("no solution\n");
}
return 0;
}