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 }

你可能感兴趣的:(rack)