1020. 潜水员

1020. 潜水员

本题的特点是状态的设置f[i][j]表示氧气含量不小于i,氮气含量不小于j的最小气缸重量。

因此在状态转移时,也会有相应的变化:

之前,j, k在枚举时最小值就是体积或者其它限制,

在这里,我们可以让它们小于限制,也就是允许状态表示时出现负数!即f(-3, -5)是合法的。

我们认为,出现负数时,状态的值和f(0, 0)是相等的,都是0,表示一个气缸都没有。

但是数组下标不能是负数,于是我们就用max()函数来防止越界

另外还有一点就是除f(0, 0)外的初始值都是正无穷,表示更新时我们不使用它们

2022-03-13_19-39-26

一个汇总

#include<iostream>
#include<cstring>

using namespace std;

const int N = 100;

int f[N][N];

int m, n, k;

int main(void){
    cin >> m >> n >> k;
    memset(f, 0x3f, sizeof f);
    f[0][0] = 0;
    for (int i = 0; i < k; i ++ ){
        int a, b, c;
        cin >> a >> b >> c;
        for (int j = m; j >= 0; j -- ){
            for (int k = n; k >= 0; k -- ){
                f[j][k] = min(f[j][k], f[max(0, j - a)][max(0, k - b)] + c);
            }
        }
    }
    cout << f[m][n];
    return 0;
}
posted @ 2022-03-13 20:28  tsrigo  阅读(24)  评论(0编辑  收藏  举报