#include <bits/stdc++.h> using namespace std; const int MOD = 1000000007; struct TestCase { int package_count; vector<int> packages; }; TestCase read_test_case(); void solve_test_case(TestCase); int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); solve_test_case(read_test_case()); } TestCase read_test_case() { TestCase test_case; cin >> test_case.package_count; test_case.packages.resize(test_case.package_count); for (auto& package : test_case.packages) cin >> package; return test_case; } void solve_test_case(TestCase test_case) { sort(test_case.packages.begin(), test_case.packages.end()); int max_el = *max_element(test_case.packages.begin(), test_case.packages.end()); // A[p][c] -> Given first p elements, how many choices that sum to at least c vector<vector<int>> A; A.resize(test_case.package_count + 1); for (auto& v : A) v.resize(max_el + 1, 0); A[0][0] = 1; // Base case, there is one choice for empty set for (int p = 0; p < test_case.package_count; p++) { for (int c = 0; c < max_el; c++) { int index = max(test_case.packages[p] - 1, c - test_case.packages[p]); A[p + 1][c] = (A[p][c] + A[p][index]) % MOD; } } cout << A[test_case.package_count][0] - 1 << "\n"; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | #include <bits/stdc++.h> using namespace std; const int MOD = 1000000007; struct TestCase { int package_count; vector<int> packages; }; TestCase read_test_case(); void solve_test_case(TestCase); int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); solve_test_case(read_test_case()); } TestCase read_test_case() { TestCase test_case; cin >> test_case.package_count; test_case.packages.resize(test_case.package_count); for (auto& package : test_case.packages) cin >> package; return test_case; } void solve_test_case(TestCase test_case) { sort(test_case.packages.begin(), test_case.packages.end()); int max_el = *max_element(test_case.packages.begin(), test_case.packages.end()); // A[p][c] -> Given first p elements, how many choices that sum to at least c vector<vector<int>> A; A.resize(test_case.package_count + 1); for (auto& v : A) v.resize(max_el + 1, 0); A[0][0] = 1; // Base case, there is one choice for empty set for (int p = 0; p < test_case.package_count; p++) { for (int c = 0; c < max_el; c++) { int index = max(test_case.packages[p] - 1, c - test_case.packages[p]); A[p + 1][c] = (A[p][c] + A[p][index]) % MOD; } } cout << A[test_case.package_count][0] - 1 << "\n"; } |