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 }
posted @ 2012-10-15 19:03  旅行的蜗牛  阅读(186)  评论(0编辑  收藏  举报