潜水员(二维DP)

-->测评传送门

题目描述
潜水员为了潜水要使用特殊的装备。他有一个带2种气体的气缸:一个为氧气,一个为氮气。让潜水员下潜的深度需要各种的数量的氧和氮。潜水员有一定数量的气缸。每个气缸都有重量和气体容量。潜水员为了完成他的工作需要不少于特定数量的氧和氮。他完成工作所需气缸的总重的最低限度的是多少?
输入格式
第一行有2整数m,n(1<=m<=21,1<=n<=79)。它们表示氧,氮各自需要的量。 第二行为整数k(1<=k<=1000)表示气缸的个数。 此后的k行,每行包括ai,bi,ci(1<=ai<=21,1<=bi<=79,1<=ci<=800)3整数。这些各自是:第i个气缸里的氧和氮的容量及汽缸重量。
输出格式
仅一行包含一个整数,为潜水员完成工作所需的气缸的重量总和的最低值。
样例
样例输入

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

249


 可以说是集合了基础背包的难度,还是难到我了

解析:

  • 还是老思路,一个一个枚举,能放就放,不过我们先将 f[ ] 初始化为无穷大,一开始只把 f[0][0] 设为 0
  • 要注意的是,放的容量若超过了题设要求,我们就把它压回题设最大边界,不影响最终结果哦~反正够了就行

一看代码就懂啦:

#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
int O[1001],N[1001],w[1001],f[1001][1001];

int main()
{
    int nedo,nedn,n;
    scanf("%d%d%d",&nedo,&nedn,&n);
    for(int i=1;i<=n;++i)
        scanf("%d%d%d",&O[i],&N[i],&w[i]);
        
    memset(f,13,sizeof(f));
    f[0][0]=0;
    for(int i=1;i<=n;++i)
    {
        for(int j=nedo;j>=0;j--)
        {
            for(int k=nedn;k>=0;k--)
            {
                int t1=j+O[i],t2=k+N[i];
                if(t1>nedo) t1=nedo;
                if(t2>nedn) t2=nedn;
                if(f[t1][t2]>f[j][k]+w[i]) 
                    f[t1][t2]=f[j][k]+w[i];
            }
        }
    }
    printf("%d",f[nedo][nedn]);
    return 0;    
}
从0到1很难,但从1到100很容易
原文地址:https://www.cnblogs.com/qseer/p/9432789.html