#include<cstdio> #include<algorithm> using namespace std; const int mod = 1000000007; int n; int nums[5005]; int DP[5005][5005]; int main(){ scanf("%d", &n); for(int i = 1; i <= n; i++){ scanf("%d", &nums[i]); } sort(nums + 1, nums + n + 1); if(nums[1] != 1){ printf("0"); return 0; } DP[1][1] = 1; for(int i = 2; i <= n; i++){ if(nums[i] == 1){ DP[i][1] += 1; } for(int j = 1; j <= 5000; j++){ DP[i][j] += DP[i-1][j]; DP[i][j] %= mod; if(nums[i] <= j + 1){ DP[i][min(j + nums[i], 5000)] += DP[i-1][j]; DP[i][min(j + nums[i], 5000)] %= mod; } } } // for(int i = 1; i <= n; i++){ // for(int j = 1; j <= 19; j++){ // printf("%d ", DP[i][j]); // } // printf("\n"); // } int wynik = 0; for(int j = 1; j <= 5000; j++){ wynik += DP[n][j]; wynik %= mod; } printf("%d", wynik); return 0; }
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 | #include<cstdio> #include<algorithm> using namespace std; const int mod = 1000000007; int n; int nums[5005]; int DP[5005][5005]; int main(){ scanf("%d", &n); for(int i = 1; i <= n; i++){ scanf("%d", &nums[i]); } sort(nums + 1, nums + n + 1); if(nums[1] != 1){ printf("0"); return 0; } DP[1][1] = 1; for(int i = 2; i <= n; i++){ if(nums[i] == 1){ DP[i][1] += 1; } for(int j = 1; j <= 5000; j++){ DP[i][j] += DP[i-1][j]; DP[i][j] %= mod; if(nums[i] <= j + 1){ DP[i][min(j + nums[i], 5000)] += DP[i-1][j]; DP[i][min(j + nums[i], 5000)] %= mod; } } } // for(int i = 1; i <= n; i++){ // for(int j = 1; j <= 19; j++){ // printf("%d ", DP[i][j]); // } // printf("\n"); // } int wynik = 0; for(int j = 1; j <= 5000; j++){ wynik += DP[n][j]; wynik %= mod; } printf("%d", wynik); return 0; } |