解題思路:這題相當詭異,樣例沒過,交了,A了,呵呵,因為理論上是可以通過的,所以

     我交了一發,然後就神奇的過了。首先要看懂題目。

 #include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn = ;
int vis[maxn], A[maxn], flag, len, sum, p[maxn], n;
char str[maxn]; int cmp(int x, int y)
{
return x > y;
} void DFS(int cnt)
{
if(cnt == )
{
sum = pow(p[], ) - pow(p[],) + pow(p[],) - pow(p[],) + pow(p[],);
if(sum == n) flag = ; //搜到符合條件的就跳出。
return ;
} for(int i = ; i < len; i++)
{
//每個點有選和不選兩種情況,所以很自然想到回溯。
if(!vis[i])
{
p[cnt] = A[i];//儲存路徑
vis[i] = ;
DFS(cnt + );
vis[i] = ;
}
if(flag) return ; //這一步必不可少,表明搜到符合條件的就要立即跳出。
}
return ;
} int main()
{
while(~scanf("%d", &n))
{
memset(vis, , sizeof(vis));
scanf("%s", str);
if(strcmp(str, "END") == ) break;
len = strlen(str);
for(int i = ; i < len; i++) A[i] = str[i] - 'A' + ;
sort(A, A + len, cmp); //直接從大到下排序,搜到第一個符合條件的直接跳出。 flag = ;
DFS();
//flag等於1表示搜到了
if(flag) for(int i = ; i < ; i++) printf("%c", p[i] + );
else printf("no solution");
printf("\n");
}
return ;
}