简单的回溯搜索题,枚举每5个字母的120中组合
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <vector>
#include <functional>
using namespace std;
vector<char>stak,ans;
int len,target;
char str[15];
void backtracking(int curi){
if(stak.size()==5){
vector<char>temp=stak;
do
{
int a=temp[0]-'A'+1,b=temp[1]-'A'+1,c=temp[2]-'A'+1,d=temp[3]-'A'+1,e=temp[4]-'A'+1;
if(a-b*b+c*c*c-d*d*d*d+e*e*e*e*e==target){
if(temp>ans)ans=temp;
}
} while (prev_permutation(temp.begin(),temp.end()));//枚举每一种排列
return;
}else if(curi>=len)return;
stak.push_back(str[curi]);
backtracking(curi+1);
stak.pop_back();
backtracking(curi+1);
}
int main(){
while (scanf("%d %s",&target,str)==2)
{
if(target==0&&strcmp(str,"END")==0)break;
stak.clear(),ans.clear();
len=strlen(str);
sort(str,str+len,greater<char>());
backtracking(0);
if(ans.size()){
for (int i=0;i<ans.size();++i)
{
printf("%c",ans[i]);
}
printf("\n");
}else printf("no solution\n");
}
return 0;
}