2 solutions

  • 0
    @ 2025-12-14 15:24:41

    更精简的版本
    优化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
      @ 2025-12-11 14:30:30
      #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