dfs求解
#include <bits/stdc++.h>
using namespace std;
int len,s1[13],visit[13],ans[6];
long long sum,target;
char s[13];
bool flag;
void dfs(int n){
if(n==6){
if(sum==target)
flag=true;
return;
}
for(int i=len-1;i>=0;i--){
if(!visit[i]){
visit[i]=1;
ans[n]=s1[i]; //ans数组保存遍历到的字符值
//计算sum值
long long x=1;
for(int j=1;j<=n;j++)
x*=s1[i];
if(n%2==0)
x=-x;
sum+=x;
dfs(n+1);
if(flag)return;
//回溯
sum-=x;
visit[i]=0;
}
}
}
int main(){
while(scanf("%lld %s",&target,s)){
memset(visit,0,sizeof(visit)); //是否访问过,0为未访问
sum=0;
if(!target&&strcmp(s,"END")==0)
break;
len=strlen(s);
flag=false;
for(int i=0;i<len;i++)
s1[i]=s[i]-'A'+1; //输入字符串转化为对应值
sort(s1,s1+len); //从小到大排序
dfs(1); //dfs求解,入参为深度
if(flag){
for(int i=1;i<6;i++)
printf("%c",ans[i]+'A'-1);
printf("\n");
}else{
printf("no solution\n");
}
}
return 0;
}