1020. 潜水员
1020. 潜水员
本题的特点是状态的设置:f[i][j]表示氧气含量不小于i,氮气含量不小于j的最小气缸重量。
因此在状态转移时,也会有相应的变化:
之前,j, k在枚举时最小值就是体积或者其它限制,
在这里,我们可以让它们小于限制,也就是允许状态表示时出现负数!即f(-3, -5)是合法的。
我们认为,出现负数时,状态的值和f(0, 0)是相等的,都是0,表示一个气缸都没有。
但是数组下标不能是负数,于是我们就用max()函数来防止越界
另外还有一点就是除f(0, 0)外的初始值都是正无穷,表示更新时我们不使用它们

#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;
}
 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号