- 潜水员
潜水员
- @ 2026-4-7 16:53:41
``// 潜水员 /* 解题思路: 二维费用背包 状态表示: 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
- 上传者