• 潜水员(二维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很容易
  • 相关阅读:
    机器学习(ML)二之损失函数
    机器学习包pip清华镜像源安装方法
    机器学习(ML)一之 Linear Regression
    linux安装glibc-2.14后字符集出问题
    HBase单机环境搭建
    MySQL基础笔记(六) 存储过程与函数
    MySQL基础笔记(五) 视图
    MySQL基础笔记(四) 索引
    MySQL基础笔记(三) 复杂查询
    MySQL基础笔记(二) 完整性约束
  • 原文地址:https://www.cnblogs.com/qseer/p/9432789.html
Copyright © 2020-2023  润新知