题目链接 -----> 潜水员
这个题目一开始看得我匪夷所思
这个题目也可以是看做,有条件的二维费用背包问题 吧
条件如下
1.氧气至少为 m
2.氮气至少为 n
3.所用的气缸的体积要尽可能的小
从上述的条件中 存在 至少这个字眼 那么这个问题要如何解决呢
因为存在至少所以肯定存在某种情况使得这个气缸中的气体的体积大于所需要的气体的体积,那我们怎么做呢?
这个时候就要用到 y总说的了: 用0
来代替体积为负数的情况
因为 当这个体积是 负数的时候说明此时的气体已经够用了,所以我们可以直接用**
0
**来代替这个情况
其实 就相当于在满足至少的情况下 使用恰好的情况来代替
Then:
因为本题的 属性为:
MIN
所以我们要将状态数组全部设为正无穷memset(f, 0x3f, sizeof f);
然后就是初始化 因为当两种气题同时为负数的时候就代表已经选好了因此f[0][0] = 0
;
At Last:
#include <iostream>
#include <cstring>
using namespace std;
static int N = 1010;
int f[25][80];
int o, n, k;
int main()
{
memset(f, 0x3f, sizeof f);
f[0][0] = 0;
cin >> o >> n >> k;
while(k--)
{
int a, b, w;
cin >> a >> b >> w;
for (int i = o; i >= 0; --i)
for (int j = n; j >= 0; --j)
f[i][j] = min(f[i][j], f[max(0, i - a)][max(0, j - b)] + w);
}
cout << f[o][n];
return 0;
}