2 条题解

  • 1
    @ 2024-8-2 9:49:54

    基础 dpdp ,考虑 dp[i][j]dp[i][j] 表示前 ii 个选择出 jj 个的最小代价。

    TT 了几发,改成一维过的,可能 stlstl 太耗时了。改成一维就和优化 0101 背包一样。

    #include <bits/stdc++.h>
    
    using i64 = long long;
    
    constexpr int N = 1E3 + 10;
    
    i64 dp[4 * N];
    
    void solve() {
        int n, k;
        std::cin >> n >> k;
    
        for (int i = 1; i <= k; ++i) {
            dp[i] = 1E18;
        }
    
        int f[5] {};
        for (int i = 1; i <= n; ++i) {
            std::cin >> f[1] >> f[2] >> f[3] >> f[4];
    
            for (int j = std::min(4 * i, k); j >= 0; --j) {
                for (int l = 1; l < 5; ++l) {
                    if (j - l >= 0) {
                        dp[j] = std::min(dp[j], dp[j - l] + f[l]);
                    }
                }
            }
        }
        std::cout << dp[k] << "\n";
    }
    
    int main() {
        std::ios::sync_with_stdio(false);
        std::cin.tie(nullptr);
    
        int t;
        std::cin >> t;
    
        while (t--) {
            solve();
        }
    
        return 0;
    }
    
    
    • 0
      @ 2024-8-15 0:33:54

      卡了二维数组的写法,疑似在每个测试样例里重新给数组赋初值导致的。

      • 1

      信息

      ID
      22
      时间
      1000ms
      内存
      256MiB
      难度
      9
      标签
      递交数
      25
      已通过
      4
      上传者