1 条题解

  • 0
    @ 2026-3-25 8:46:38

    文字教学

    这道题是01背包问题的变种,核心是让装入箱子的体积尽可能大(不超过容量V),这样剩余空间就最小。

    1. 状态定义:设 dp[j] 表示用不超过 j 的体积,最多能装多少。
    2. 状态转移:对于每个物品体积 x,从后往前遍历 j(避免重复装同一个物品):
      • 不装这个物品:dp[j] 不变。
      • 装这个物品:如果 j >= x,则 dp[j] = max(dp[j], dp[j - x] + x)
    3. 最终答案:V - dp[V] 就是最小剩余空间。

    代码

    #include <bits/stdc++.h>
    using namespace std;
    
    int dp[20005];
    int a[35];
    
    int main() {
        int v, n;
        cin >> v >> n;
        for (int i = 1; i <= n; ++i) {
            cin >> a[i];
        }
        memset(dp, 0, sizeof(dp));
        for (int i = 1; i <= n; ++i) {
            for (int j = v; j >= a[i]; --j) {
                dp[j] = max(dp[j], dp[j - a[i]] + a[i]);
            }
        }
        cout << v - dp[v] << endl;
        return 0;
    }
    
    • 1

    信息

    ID
    49
    时间
    1000ms
    内存
    125MiB
    难度
    3
    标签
    递交数
    4
    已通过
    3
    上传者