1 条题解

  • 0
    @ 2026-11-1 19:56:07

    [NOIP 2006 普及组] 开心的金明(Happy Jinming) 题解

    思路分析

    标准 0/1 背包问题:将总钱数 nn 视为背包容量,第 ii 件物品的体积为价格 viv_i,价值为 vi×piv_i \times p_i。使用一维滚动数组 dp[0..n],对每件物品逆序枚举容量 j 从 n 到 v 更新 dp[j] = max(dp[j], dp[j - v] + v * p) 即可。时间复杂度 O(nm)O(nm)。

    参考代码

    #include <algorithm>
    #include <iostream>
    using namespace std;
    
    long long dp[30005];
    
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        int n, m;
        if (!(cin >> n >> m)) return 0;
        for (int i = 0; i < m; ++i)
        {
            int v, p;
            cin >> v >> p;
            long long val = 1LL * v * p;
            for (int j = n; j >= v; --j)
            {
                dp[j] = max(dp[j], dp[j - v] + val);
            }
        }
        cout << dp[n] << "\n";
        return 0;
    }
    
    • 1

    [NOIP 2006 普及组] 开心的金明(Happy Jinming)

    信息

    ID
    8554
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者