题解:潜水员

题目

一个人去潜水,分别带氧气和氮气,给出所需要的氧气和氮气和气瓶数,求在气体够用的情况下的最小重量(大概就是这个意思)

样例

输入
5 60 5
3 36 120
10 25 129
5 50 250
1 45 130
4 20 119
输出
249

解析

这道题是一个多维背包问题,定义dp[i][j]表示i氧气,j氮气,所需要的重量的最小值(注意这里状态转移方程要取min

有几个地方要注意

1、状态转移方程不要忘了是取最小值(上文说过)
2、因为要取最小值所以数组不要忘了初始化成极大值,但是初始化完了不要忘了dp[0][0]再给赋回0去。。
3、你加的氧气或者氮气可能会多,为了最后直接输出dp[m][n],在循环中设两个变量保证不会超出去(其实都一样,不会影响最后结果的)

代码

#include<bits/stdc++.h>
using namespace std;
int n,m;
int k;
struct air{
    int a, b, c;
}h[1001];
int dp[101][101];
int o2 = 0,n2 = 0;
int main()
{
    scanf("%d %d" ,&m,&n);
    scanf("%d" ,&k);
    memset(dp,0x3f,sizeof(dp));
    dp[0][0] = 0;
    for(int i = 1;i <= k; i++){
	    scanf("%d %d %d" ,&h[i].a,&h[i].b,&h[i].c);
    }
    for(int i = 1;i <= k; i++){
	    for(int j = m;j >= 0; j--){
		    for(int k = n;k >= 0; k--){
			    int o2 = j + h[i].a;
			    int n2 = k + h[i].b;
			    if(o2 > m) o2 = m;
			    if(n2 > n) n2 = n;
			    dp[o2][n2] = min(dp[o2][n2],dp[j][k] + h[i].c);
		    }
	    }
    }
    printf("%d" ,dp[m][n]);
    return 0;
}
posted @ 2021-05-22 16:10  24Kmagic  阅读(251)  评论(0)    收藏  举报