[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 }