HDOJ 1015 Safecracker
题意: 大致是给一个数 target, 和一个字符串 str, 然后从字符串str 中选择五个字母满足方程 v - w^2 + x^3 - y^4 + z^5 = target 即可,但是在此之前需要给字符串排下序(这个地方纠结了好久,在网上看了资料才明白要排序,尼玛)
解题思路:字符串最多才12,果断DFS 水过了。
分类: DFS ,类似于背包问题。
6924293 | 2012-10-15 18:57:36 | Accepted | 1015 | 109MS | 256K | 950 B | C++ | 罗维 |
View Code
1 #include <iostream> 2 #include <algorithm> 3 #include <string> 4 #include <math.h> 5 using namespace std; 6 7 string str; 8 int target; 9 bool ok; 10 bool used[20]; 11 12 void dfs(int p, string s) 13 { 14 int i; 15 if(ok) return ; 16 17 if(p == 5) 18 { 19 int sum = 0; 20 int op = 1; 21 for (i=0; i<5; i++) 22 { 23 sum += op * pow((double)(s[i] - 'A' + 1), i + 1); 24 op *= -1; 25 } 26 if(sum == target) 27 { 28 ok = true; 29 cout<<s<<endl; 30 return ; 31 } 32 } 33 else 34 { 35 for ( i=str.length()-1; i>=0; i--) 36 { 37 if(!used[i]) 38 { 39 used[i] = true; 40 s += str[i]; 41 dfs(p + 1, s); 42 used[i] = false; 43 s = s.substr(0,p); 44 if(ok) return; 45 } 46 } 47 } 48 } 49 50 int main() 51 { 52 string s; 53 while(cin>>target>>str) 54 { 55 if(target == 0 && str == "END") break; 56 57 sort(str.begin(), str.end()); 58 ok = false; 59 s = ""; 60 memset(used, false, sizeof(used)); 61 62 dfs(0, s); 63 if(!ok) 64 cout<<"no solution"<<endl; 65 66 67 } 68 return 0; 69 }