[uva] 10344 - 23 out of 5

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1285

这道题就比较单纯啦, 生成可重集的排列+dfs.

为了练习 我就不用stl了.

 1 //
 2 //  main.cpp
 3 //  uva10344
 4 //
 5 //  Created by ello on 1/7/14.
 6 //  Copyright (c) 2014 NextLife. All rights reserved.
 7 //
 8 
 9 #include <cstdio>
10 #include <cstring>
11 #include <algorithm>
12 using namespace std;
13 
14 int gArr[5] = {0};
15 int gCopy[5] = {0};
16 
17 bool dfs(int cur, int last) {
18     if (cur == 4) {
19         if (last == 23) {
20             return true;
21         }
22         return false;
23     }
24     if (dfs(cur + 1, last + gCopy[cur + 1]) ||
25         dfs(cur + 1, last - gCopy[cur + 1]) ||
26         dfs(cur + 1, last * gCopy[cur + 1])) {
27         return true;
28     }
29     return false;
30 }
31 
32 bool solve(int cur) {
33     if (cur == 5) {
34         if (dfs(0, gCopy[0])) {
35             return true;
36         }
37         return false;
38     }
39     for (int i = 0; i < 5; ++i) if (!i || gArr[i] != gArr[i - 1]) {
40         int cnt1 = 0, cnt2 = 0;
41         for (int j = 0; j < 5; ++j) if (gArr[j] == gArr[i]) cnt1 += 1;
42         for (int j = 0; j < cur; ++j) if (gCopy[j] == gArr[i]) cnt2 += 1;
43         if (cnt2 < cnt1) {
44             gCopy[cur] = gArr[i];
45             if (solve(cur + 1)) {
46                 return true;
47             }
48         }
49     }
50     return false;
51 }
52 
53 int main(int argc, const char * argv[])
54 {
55     while (scanf("%d%d%d%d%d", &gArr[0], &gArr[1], &gArr[2], &gArr[3], &gArr[4]) != EOF) {
56         if (gArr[0] == 0) {
57             break;
58         }
59         sort(gArr, gArr + 5);
60         memcpy(gCopy, gArr, sizeof(gArr));
61         if (solve(0)) {
62             printf("Possible\n");
63         } else {
64             printf("Impossible\n");
65         }
66     }
67     return 0;
68 }

 

posted @ 2014-01-07 02:48  NextLife  阅读(314)  评论(0)    收藏  举报