2 solutions
-
0
更精简的版本
优化dp数组至一维#include<bits/stdc++.h> using namespace std; const int mod = 998244353; long long n,a[5005],f[5005]={1},ans; int main() { cin >> n; for(int i=1;i<=n;i++) cin >> a[i]; for(int i=1;i<=n;i++){ for(int j=5001;j>a[i];j--) ans = (ans+f[j])%mod; for(int j=5001;j>=5001-a[i];j--) f[5001] = (f[j]+f[5001])%mod; for(int j=5000;j>=a[i];j--) f[j] = (f[j-a[i]]+f[j])%mod; } cout << ans << endl; return 0; } -
0
#include<bits/stdc++.h> using namespace std; #define int long long int n; int sz[5001]; int dp[5001][5002]; const int mod = 998244353; signed main() { cin >> n; for (int i = 1; i <= n; i++) { cin >> sz[i]; } sort(sz + 1, sz + n + 1); dp[0][0] = 1; int total = 0; // int kt = min(5001ll, ma + 1); for (int i = 1; i <= n ; i++) { for (int k = 0; k <= 5001; k++) dp[i][k] = dp[i - 1][k]; for (int z = sz[i] + 1; z <= 5001; z++) { total += dp[i - 1][z]; total %= mod; } for (int k = 5001; k >= 5001 - sz[i]; k--) { dp[i][5001] += dp[i - 1][k]; dp[i][5001] %= mod; } for (int k = 5000; k >= sz[i]; k--) { dp[i][k] += dp[i - 1][k - sz[i]]; dp[i][k] %= mod; } } cout << total; }
- 1
Information
- ID
- 503
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 5
- Tags
- (None)
- # Submissions
- 31
- Accepted
- 13
- Uploaded By