zoukankan      html  css  js  c++  java
  • 潜水员(二维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很容易
  • 相关阅读:
    seata原理
    activemq 启动时出现错误 Address already in use: JVM_Bind
    高并发第五弹:安全发布对象及单例模式
    高并发第三弹:线程安全原子性
    高并发第一弹:准备阶段 了解高并发
    CentOS7安装PostgreSQL9.4
    高并发第二弹:并发概念及内存模型(JMM)
    高并发第四弹:线程安全性可见性有序性
    设计模式模板方法模式
    设计模式建造者模式(图解,使用场景)
  • 原文地址:https://www.cnblogs.com/qseer/p/9432789.html
Copyright © 2011-2022 走看看