HDOJ -- 1015

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 }
原文地址:https://www.cnblogs.com/anhuizhiye/p/3673302.html