#include #include //#include using std::vector; vector> optimalWeight2DArray(int W, vector &w2) { int j = w2.size(); // int value[W + 1][j + 1]; vector > value(W + 1, vector(j + 1)); for (int i = 0; i < j + 1; i++) { for (int w = 0; w < W + 1; w++) { if (i == 0 || w == 0) { value[w][i] = 0; continue; } value[w][i] = value[w][i - 1]; if (w2[i - 1] <= w) { int val = value[w - w2[i - 1]][i - 1] + w2[i - 1]; if (value[w][i] < val) { value[w][i] = val; } } } } return value; } int partition3(vector &a) { if (a.size() < 3) return 0; int sum = 0; for (int i = 0; i < a.size(); i++) { sum = sum + a[i]; } if (sum % 3 != 0) return 0; int W = sum / 3; vector > values = optimalWeight2DArray(W, a); int count = 0; for (int i = 1; i < a.size() + 1; i++) { for (int w = 1; w < W + 1; w++) { if (values[w][i] == W) count = count + 1; } } if (count >= 3) return 1; else return 0; } //TEST(KnapsackPartition3, t1) { // vector a = { 3, 3, 3, 3 }; // ASSERT_EQ(0, partition3(a)); //} // //TEST(KnapsackPartition3, t2) { // vector a = { 30 }; // ASSERT_EQ(0, partition3(a)); //} // //TEST(KnapsackPartition3, t3) { // vector a = { 1, 2, 3, 4, 5, 5, 7, 7, 8, 10, 12, 19, 25 }; // ASSERT_EQ(1, partition3(a)); //} int main() { int n; std::cin >> n; vector A(n); for (size_t i = 0; i < A.size(); ++i) { std::cin >> A[i]; } std::cout << partition3(A) << '\n'; }