#include <stdio.h> #include <algorithm> #include <vector> #define MODUL 1'000'000'007 int dodaj(int b, int a) { int wynik = a + b; if (wynik >= MODUL) { wynik -= MODUL; } return wynik; } int main() { int n; scanf("%d", &n); std::vector<int> a(n, 0); std::vector<std::vector<int> > zb; zb.reserve(n); for(int i = 0; i < n; ++i) { scanf("%d", &a[i]); } std::sort(a.begin(), a.end()); if (a[0] > 1) { printf("0\n"); return 0; } const int najw_pudelko = a.back(); zb[0] = std::vector<int>(najw_pudelko+2, 0); zb[0][0] = 1; zb[0][1] = 1; //for(int j = 0; j < najw_pudelko+2; ++j) { //fprintf(stderr, "\t%d", zb[0][j]); //} //fprintf(stderr, "\n"); for(int i = 1; i < n; ++i) { zb[i] = zb[i-1]; for(int j = 2*a[i]-1; j < najw_pudelko+1; ++j) { zb[i][j] = dodaj(zb[i][j], zb[i-1][j-a[i]]); } zb[i][najw_pudelko+1] = dodaj(zb[i][najw_pudelko+1], zb[i][najw_pudelko+1]); for(int j = 0; j < a[i] && a[i]-1 <= najw_pudelko-j; ++j) { zb[i][najw_pudelko+1] = dodaj(zb[i][najw_pudelko+1], zb[i-1][najw_pudelko-j]); } //for(int j = 0; j < najw_pudelko+2; ++j) { //fprintf(stderr, "\t%d", zb[i][j]); //} //fprintf(stderr, "\n"); } int wynik = 0; for(int i = 1; i < najw_pudelko+2; ++i) { wynik = dodaj(wynik, zb[n-1][i]); } printf("%d\n", wynik); }
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 55 56 57 58 59 | #include <stdio.h> #include <algorithm> #include <vector> #define MODUL 1'000'000'007 int dodaj(int b, int a) { int wynik = a + b; if (wynik >= MODUL) { wynik -= MODUL; } return wynik; } int main() { int n; scanf("%d", &n); std::vector<int> a(n, 0); std::vector<std::vector<int> > zb; zb.reserve(n); for(int i = 0; i < n; ++i) { scanf("%d", &a[i]); } std::sort(a.begin(), a.end()); if (a[0] > 1) { printf("0\n"); return 0; } const int najw_pudelko = a.back(); zb[0] = std::vector<int>(najw_pudelko+2, 0); zb[0][0] = 1; zb[0][1] = 1; //for(int j = 0; j < najw_pudelko+2; ++j) { //fprintf(stderr, "\t%d", zb[0][j]); //} //fprintf(stderr, "\n"); for(int i = 1; i < n; ++i) { zb[i] = zb[i-1]; for(int j = 2*a[i]-1; j < najw_pudelko+1; ++j) { zb[i][j] = dodaj(zb[i][j], zb[i-1][j-a[i]]); } zb[i][najw_pudelko+1] = dodaj(zb[i][najw_pudelko+1], zb[i][najw_pudelko+1]); for(int j = 0; j < a[i] && a[i]-1 <= najw_pudelko-j; ++j) { zb[i][najw_pudelko+1] = dodaj(zb[i][najw_pudelko+1], zb[i-1][najw_pudelko-j]); } //for(int j = 0; j < najw_pudelko+2; ++j) { //fprintf(stderr, "\t%d", zb[i][j]); //} //fprintf(stderr, "\n"); } int wynik = 0; for(int i = 1; i < najw_pudelko+2; ++i) { wynik = dodaj(wynik, zb[n-1][i]); } printf("%d\n", wynik); } |