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;
}