1.DFS
1 #include<cmath> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<string> 5 #include<cstring> 6 #include<iostream> 7 #include<algorithm> 8 using namespace std; 9 char str[20], ans[10]; 10 int vis[20], flag; 11 bool cmp(char a, char b){return a > b;} 12 void dfs(int dep, int target, int len){ 13 if(dep == 5){ 14 int sum = 0; 15 for(int i = 1; i <= 5; i ++) 16 sum += (int)pow(ans[i-1]-'A'+1., i)*(int)pow(-1., i+1); 17 if(sum == target){ 18 flag = 1; 19 printf("%s ", ans); 20 } 21 return ; 22 } 23 for(int i = 0; i < len; i ++){ 24 if(!vis[i]){ 25 vis[i] = 1; 26 ans[dep] = str[i]; 27 dfs(dep+1, target, len); 28 if(flag) return; 29 vis[i] = 0; 30 } 31 } 32 } 33 int main(){ 34 int target; 35 freopen("in.c", "r", stdin); 36 while(~scanf("%d%s", &target, str) && strcmp(str, "END") && target){ 37 flag = 0; 38 memset(vis, 0, sizeof(vis)); 39 int len = strlen(str); 40 sort(str, str+len, cmp); 41 dfs(0, target, len); 42 if(!flag) printf("no solution "); 43 memset(str, 0, sizeof(str)); 44 } 45 return 0; 46 }
2,二进制枚举
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<algorithm> 5 #include<cstring> 6 using namespace std; 7 int main(){ 8 int n, a[20]; 9 string str; 10 freopen("in.c", "r", stdin); 11 while(cin >> n >> str && str != "END" && n){ 12 char ans[10] = "A"; 13 int flag = 0; 14 for(int i = 0;i < (1 << str.size()); i ++){ 15 int cnt = 0, sum = 0; 16 for(int j = 0; j < str.size(); j ++){ 17 if(i & (1 << j)) a[cnt++] = j; 18 } 19 if(cnt == 5){ 20 char tmp[10]; 21 for(int i = 0; i < 5; i ++) tmp[i] = str[a[i]]; 22 sort(tmp, tmp+5); 23 do{ 24 int sum = 0; 25 for(int i = 1; i <= 5; i ++) 26 sum += (int)pow(-1., i+1)*(int)pow(tmp[i-1]-'A'+1., i); 27 if(sum == n){ 28 flag = 1; 29 if(strcmp(ans, tmp) < 0) strcpy(ans, tmp); 30 } 31 }while(next_permutation(tmp, tmp+cnt)); 32 } 33 } 34 if(flag) printf("%s ", ans); 35 else cout << "no solution" << endl; 36 } 37 return 0; 38 }