1 条题解

  • 0
    @ 2025-5-5 15:08:39
    #include<bits/stdc++.h>
    
    using namespace std;
    
    int n, V; //
    int v[10010];
    int w[10010];
    int s[10010];
    int dp[10010];
    
    int main() {
        ios::sync_with_stdio(0);
        cin.tie(0);
        cout.tie(0);
    
        cin >> n >> V;
    
        for (int i = 1; i <= n; i++) {
            cin >> v[i] >> w[i] >> s[i];
        }
    
    
        for (int i = 1; i <= n; i++) {
            if (s[i] == -1) {
                for (int j = V; j >= v[i]; j--) {
                    dp[j] = max(dp[j], dp[j - v[i]] + w[i]);
                }
            }
            else if (s[i] == 0) {
                for (int j = v[i]; j <= V; j++) {
                    dp[j] = max(dp[j], dp[j - v[i]] + w[i]);
                }
            }
            else {
                // 二进制优化 s[i] 拆成 1,2,4,8,16,32...2^p 和s[i] - (1,2,4,8,16,32...2^p)的和 (s[i] - (1,2,4,8,16,32...2^p) 无法再拆出 2^q (q > p))
                // 显然 这些数任意组合 可以得到1到s[i]的任何数
    
                int p = s[i]; // 剩余的数
                for (int j = 1; j <= p; j = j * 2) {
                    for (int k = V; k >= v[i] * j; k--) {
                        dp[k] = max(dp[k], dp[k - v[i] * j] + w[i] * j);
                    }
                    p -= j;
                }
                
                if (p > 0) {
                    for (int k = V; k >= v[i] * p; k--) {
                        dp[k] = max(dp[k], dp[k - v[i] * p] + w[i] * p);
                    }
                }
            }
        }
    
        cout << dp[V] << endl;
    
        return 0;
    }
    
    
    
    • 1

    信息

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