``// 潜水员 /* 解题思路: 二维费用背包 状态表示: f[i][j] 拿到 至少 i个氮气 j个氧气 需要负担的最小重量 状态转移: 根据选/不选 新气缸 转移到对应的状态 特别的 选择 l 气缸 后 如果 i-a[l] 或者 j-b[l]是负数, 应该转移到0状态, “这些气缸应该拥有至少负几升的氧气容量”这样的表述没有意义, 由于气缸的氧气容量最小为0,因此该表述等价于“这些气缸应该拥有至少0升的氧气容量”。 */

#include<bits/stdc++.h> using namespace std;

const int K = 1010, M = 25, N = 85;

int n, m, k, a[K],b[K],c[K], f[M][N]; int main() { cin >> m >> n ; cin >> k; for(int i = 1; i <= k; i++) cin >> a[i] >> b[i] >> c[i];

memset(f,0x3f,sizeof(f)); //默认极大值

f[0][0] = 0;
for(int l = 1; l <= k; l++)
    for(int i = m; i >= 0; i--) //费用1
        for(int j = n; j >= 0; j--) // 费用2 
            f[i][j] = min(f[i][j],  f[max(i-a[l], 0)][max(j-b[l], 0)]+ c[l]);   
cout << f[m][n];

} ``

0 条评论

目前还没有评论...

信息

ID
1858
时间
ms
内存
MiB
难度
5
标签
递交数
135
已通过
56
上传者