1 条题解

  • 0
    @ 2026-9-23 0:29:54

    如何表示状态?

    dp[j]  前i只奶牛用for完成。
    

    状态转移方程?

    dp[j] = max(dp[j], dp[j−s[i]] + f[i])
    

    初始状态?

    memset(dp, −0x3f, sizeof(dp)); 负无穷
    
    dp[400000] = 0;
    

    代码

    #include<bits/stdc++.h>
    using namespace std;
    
    int n;
    int s[405], f[405];
    int dp[400005];
    const int MR = 100000;
    
    int main() {
        memset(dp, -0x3f, sizeof(dp));
    	cin >> n;
    	for (int i = 1; i <= n; i++) {
    	    cin >> s[i] >> f[i];
    	}
    	dp[MR] = 0;
    	for (int i = 1; i <= n; i++) {
    		if (s[i] >= 0) {
    		    for (int j = 2 * MR; j >= s[i]; j--) {
    		        dp[j] = max(dp[j], dp[j - s[i]] + f[i]);
    		    }
    		} else {
    		    for (int j = 0; j <= 2 * MR + s[i]; j++) {
    		        dp[j] = max(dp[j], dp[j - s[i]] + f[i]);
    		    }
    		}
    	}
    	int ans = 0;
    	for (int i = MR; i <= 2 * MR; i++)
    		if (dp[i] >= 0)
    			ans = max(ans, i + dp[i] - MR);
    	cout << ans << endl;
        return 0;
    }
    
    • 1

    信息

    ID
    2197
    时间
    1000ms
    内存
    128MiB
    难度
    10
    标签
    递交数
    7
    已通过
    2
    上传者