1 条题解

  • 0
    @ 2023-1-3 20:14:30

    满分做法

    #include <bits/stdc++.h>
    using namespace std;
    const int MAXN = 1000;
    const int MAXM = 79;
    int n, m1, m2;
    int v1[MAXN + 5], v2[MAXN + 5], w[MAXN + 5];
    int dp[MAXM + 5][MAXM + 5];//dp[i][j]: 提供i氧气、j氮气时的最小重量是多少
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin >> m1 >> m2;
        cin >> n;
        for (int i = 1; i <= n; i++)
            cin >> v1[i] >> v2[i] >> w[i];
        memset(dp, 0x3f, sizeof(dp)); // 初始化为无穷大(约 1e9)
        dp[0][0] = 0;
        for (int i = 1; i <= n; i++)
            for (int j1 = m1; j1 >= 0; j1--)
                for (int j2 = m2; j2 >= 0; j2--)
                {
                    int jj1 = min(m1, j1 + v1[i]); // 使用了第i件物品后的第一种花费
                    int jj2 = min(m2, j2 + v2[i]); // 使用了第i件物品后的第二种花费
                    dp[jj1][jj2] = min(dp[jj1][jj2], dp[j1][j2] + w[i]);
                }
        cout << dp[m1][m2] << "\n";
        return 0;
    }
    
    

    非满分做法

    如果不能理解 int jj2 = min(m2, j2 + v2[i]); 用处可以先看看这个做法

    #include <bits/stdc++.h>
    using namespace std;
    const int MAXN = 1000;
    int n, m1, m2;
    int v1[MAXN + 5], v2[MAXN + 5], w[MAXN + 5];
    int dp[1000][10000]; // dp[i][j]: 提供i氧气、j氮气时的最小重量是多少
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin >> m1 >> m2;
        cin >> n;
        int m1_MAX = 0, m2_MAX = 0;
        for (int i = 1; i <= n; i++)
        {
            cin >> v1[i] >> v2[i] >> w[i];
            m1_MAX += v1[i];
            m2_MAX += v2[i];
        }
        assert(m1_MAX < 1000 && m2_MAX < 10000);
        memset(dp, 0x3f, sizeof(dp)); // 初始化为无穷大(约 1e9)
        dp[0][0] = 0;
        for (int i = 1; i <= n; i++)
            for (int j1 = m1_MAX; j1 >= v1[i]; j1--)
                for (int j2 = m2_MAX; j2 >= v2[i]; j2--)
                {
                    if (dp[j1 - v1[i]][j2 - v2[i]] != 0x3f3f3f3f)
                        dp[j1][j2] = min(dp[j1][j2],
                                         dp[j1 - v1[i]][j2 - v2[i]] + w[i]);
                }
        int ans = 0x3f3f3f3f;
        for (int j1 = m1_MAX; j1 >= m1; j1--)
            for (int j2 = m2_MAX; j2 >= m2; j2--)
                ans = min(ans, dp[j1][j2]);
        cout << ans << "\n";
        return 0;
    }
    
    • 1

    信息

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