1 条题解

  • 0
    @ 1997-7-1 23:22:39

    【例86.3】 完全背包问题

    解题思路

    完全背包每种可重复,dp含义同最大价值。容量从w向M升序更新,dp[j-w]允许已包含当前物品,从而可再放一件。

    正确性说明

    依照上述推导,逐步维护已处理部分的有效状态。每一步都完成当前项的贡献且不改变已确定的次序,结束时输出的状态恰好对应题目要求。

    易错点

    与01背包方向相反;按本站样例输出max=前缀。

    复杂度

    时间O(NM),空间O(M)。

    参考代码(C++11)

    #include <bits/stdc++.h>
    using namespace std;
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        int M, N;
        cin >> M >> N;
        vector<long long> dp(M + 1);
        while (N--) {
            int w;
            long long v;
            cin >> w >> v;
            for (int j = w; j <= M; j++)
                dp[j] = max(dp[j], dp[j - w] + v);
        }
        cout << "max=" << dp[M] << "\n";
        return 0;
    }
    
    • 1

    信息

    ID
    534
    时间
    1000ms
    内存
    128MiB
    难度
    普及
    标签
    递交数
    0
    已通过
    0
    上传者