#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char str[15];
int num, ok, s[15], vis[30], n, ans[5];
int cmp(const void *a, const void *b)
{
return *(int *)b - *(int *)a;
}
int power(int x,int y)
{
int i;
i = x;
while(--y)
{
x *= i;
}
return x;
}
void dfs()
{
int i, j, k, l, m;
for(i = 0; i < n; ++i)
{
vis[i] = 1;
for(j = 0; j < n; ++j)
{
if(vis[j])
continue;
vis[j] = 1;
for(k = 0; k < n; ++k)
{
if(vis[k])
continue;
vis[k] = 1;
for(l = 0; l < n; ++l)
{
if(vis[l])
continue;
vis[l] = 1;
for(m = 0; m < n; ++m)
{
if(vis[m])
continue;
if(s[i] - power(s[j], 2) + power(s[k], 3) - power(s[l], 4) + power(s[m], 5) == num)
{
ok = 1;
ans[0] = s[i];
ans[1] = s[j];
ans[2] = s[k];
ans[3] = s[l];
ans[4] = s[m];
return;
}
}
vis[l] = 0;
}
vis[k] = 0;
}
vis[j] = 0;
}
vis[i] = 0;
}
}
int main()
{
int i, j, k;
while(scanf("%d %s", &num, str) != EOF)
{
if(num == 0 && strcmp(str, "END") == 0)
break;
n = strlen(str);
for(i = 0; i < n; ++i)
s[i] = str[i] - 64;
ok = 0;
qsort(s, n, sizeof(s[0]), cmp);
memset(vis, 0, sizeof(vis));
dfs();
if(ok)
printf("%c%c%c%c%c\n", ans[0]+64, ans[1]+64, ans[2]+64, ans[3]+64, ans[4]+64);
else
printf("no solution\n");
}
return 0;
}
题意:给出5~12个不同的大写字母组成的字符串,并且给定一个目标值,规定A~Z的值为1~26, 从该字符串中挑出5个字母组成一个字符串vwxyz,要求v - w^2 + x^3 - y^4 + z^5 = target。如果有多个符合要求的字符串,则输出字典序最大的那个。否则输出no solution。
思路:此题可以直接暴力求解,先将给出的字符串的值保存到数组中,然后对数组进行降序排序,接着5个for循环求出这5个字符。