#include <stdio.h> #include <string.h> #include <vector> #include <string> using namespace std; #define MAX_ELEMENT_COUNT 40 #define MAX_ELEMENT_VALUE 1000 #define MAX_SUM 40000 int n; int element[MAX_ELEMENT_COUNT]; int T[MAX_ELEMENT_COUNT][MAX_SUM + MAX_SUM + 1]; int answer[MAX_ELEMENT_COUNT], pruning_bound; void addToAnswer(int ways, int i) { if (answer[i] == 0) answer[i] = ways; else if (answer[i] == -ways) { answer[i] = 2; while (answer[pruning_bound + 1] == 2 && pruning_bound < n) pruning_bound++; } } void buildAnswer(int i, int sum) { if (i <= pruning_bound) return; if (i == 0) { addToAnswer(T[i][sum], i); return; } addToAnswer(T[i][sum], i); if (T[i][sum] == 1) { buildAnswer(i - 1, sum - element[i]); } else if (T[i][sum] == -1) { buildAnswer(i - 1, sum + element[i]); } else if (T[i][sum] == 2) { answer[i] = 2; buildAnswer(i - 1, sum - element[i]); buildAnswer(i - 1, sum + element[i]); } } int main() { int expected_sum; scanf("%d%d", &n, &expected_sum); while (n != 0 || expected_sum != 0) { for (int i = 0; i < n; i++) { scanf("%d", &element[i]); } memset(T, 0, sizeof(T)); if (element[0] != 0) { T[0][MAX_SUM - element[0]] = -1; T[0][MAX_SUM + element[0]] = 1; } else T[0][MAX_SUM - element[0]] = 2; vector<int> level[2]; int next = 0, prev = 1; level[next].push_back(MAX_SUM - element[0]); level[next].push_back(MAX_SUM + element[0]); for (int i = 1; i < n; i++) { prev = next; next = next ^ 1; level[next].clear(); for (int j = 0; j < level[prev].size(); j++) { int generated = level[prev][j] + element[i]; if (T[i][generated] == 0) { level[next].push_back(generated); T[i][generated] = +1; } else if (T[i][generated] == -1) { T[i][generated] = 2; } generated = level[prev][j] - element[i]; if (T[i][generated] == 0) { level[next].push_back(generated); T[i][generated] = -1; } else if (T[i][generated] == 1) { T[i][generated] = 2; } } } if (T[n - 1][MAX_SUM + expected_sum]) { memset(answer, 0, sizeof(answer)); pruning_bound = -1; buildAnswer(n - 1, MAX_SUM + expected_sum); for (int i = 0; i < n; i++) { char ch = answer[i] == -1 ? '-' : (answer[i] == 1 ? '+' : '?'); printf("%c", ch); } printf("\n"); } else printf("*\n"); scanf("%d%d", &n, &expected_sum); } return 0; }
Thursday, April 23, 2015
UVa 11832 - Account Book
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment