首页 > 编程语言 >蓝桥杯Java ABC组 AcWing P1020 潜水员

蓝桥杯Java ABC组 AcWing P1020 潜水员

时间:2024-03-22 10:33:44浏览次数:38  
标签:ABC Java int 蓝桥 nextInt 最小值 体积 new static

题目链接:
https://www.acwing.com/problem/content/1022/

#二维背包 #Model #Favorite

思路

好题!

可以让你思考各种背包问题中,对体积的定义不同,则初始化就不同

本题求的是是至少需要体积 V V V,重量 M M M 的情况下,能拿到价值的最小值。

就拿体积来说,至少需要多少体积,也就是说有体积比需要的体积大的物品还是能用得到,例如 f[3][5],至少需要 3 个体积,5 个重量,求能拿到价值的最小值,现在只有一个物品,体积是 4,重量是 4,价值 w w w,它说至少需要 3 个体积,那么体积是 4 还是可以用到,只是多了 1 个体积没用占着而已,不影响其价值,此时 f[-1][1] 这个状态是合法的。

因此若用了这个物品,则变成了求 f[0][1] + w,表示体积已经不再需求了,只需要 0 个体积即可

f[0][i] 代表的意思是体积大于等于 0,重量大于等于 i 时价值的最小值

可以认为在至少的语义上,物品的体积上限是没有限制的,反而是物品体积的下限需要有限制

下面是总结:

求最大值最小值初始化总结
二维情况
1、体积至多jf[i,k] = 00 <= i <= n, 0 <= k <= m(只会求价值的最大值)
2、体积恰好j,
当求价值的最小值:f[0][0] = 0, 其余是INF
当求价值的最大值:f[0][0] = 0, 其余是-INF
3、体积至少jf[0][0] = 0,其余是INF(只会求价值的最小值)

一维情况
1、体积至多j,f[i] = 0, 0 <= i <= m(只会求价值的最大值)
2、体积恰好j,
当求价值的最小值:f[0] = 0, 其余是INF
当求价值的最大值:f[0] = 0, 其余是-INF
3、体积至少j,f[0] = 0,其余是INF(只会求价值的最小值)

[!summary]
可以这么思考,初始化的过程就是定义状态是否合法的过程

  • 体积最多为 j,则像 f[0][j] 是合法情况
  • 体积恰好为 j,则像 f[0][j] 是不合法的情况,因为不放物品时体积不会恰好为一个非 0 数
  • 体积最少为 j,则像 f[0][j] 是不合法情况

代码

import java.io.*;  
import java.util.*;  
import static java.lang.Math.*;  
  
public class Main {  
  
    static int status;  
    static BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));  
    static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));  
    static PrintWriter cout = new PrintWriter(bw);  
    static StreamTokenizer st = new StreamTokenizer(buf);  
  
    public static int nextInt() throws IOException {  
        status = st.nextToken();  
        return (int) st.nval;  
    }  
  
    public static long nextLong() throws IOException {  
        status = st.nextToken();  
        return (long) st.nval;  
    }  
  
    public static String nextString() throws IOException {  
        status = st.nextToken();  
        return st.sval;  
    }  
  
    static int n, v, m;  
    static int[][] f;  
    static int[] a,b,c;  
    static final int INF = Integer.MAX_VALUE-666666;  
  
    public static void main(String[] args) throws IOException {  
        v = nextInt();  
        m = nextInt();  
        n = nextInt();  
        a = new int[n + 1];  
        b = new int[n + 1];  
        c = new int[n + 1];  
        f = new int[v+1][m+1];  
  
        for(int i=1;i<=n;i++){  
            a[i] = nextInt();  
            b[i] = nextInt();  
            c[i] = nextInt();  
        }  
  
        for(int i=0;i<=v;i++)  
            for(int j=0;j<=m;j++)  
                f[i][j]=INF;  
        f[0][0]=0;  
  
        for(int i=1;i<=n;i++)  
            for(int j=v;j>=0;j--)  
                for(int k=m;k>=0;k--)  
                    f[j][k]=min(f[j][k],f[max(0,j-a[i])][max(0,k-b[i])]+c[i]);  
  
        cout.println(f[v][m]);  
        cout.flush();  
    } // End of main  
}

标签:ABC,Java,int,蓝桥,nextInt,最小值,体积,new,static
From: https://blog.csdn.net/qq_36992525/article/details/136933284

相关文章

  • Java中的代理模式(动态代理和静态代理)
    代理模式我们先了解一下代理模式:在开发中,当我们要访问目标类时,不是直接访问目标类,而是访问器代理类。通过代理类调用目标类完成操作。简单来说就是:把直接访问变为间接访问。这样做的最大好处就是:我们可以在代理类调用目标类之前和之后去添加一些预处理和后处理操作。来扩展......
  • JAVA对象、类和基本数据类型
    变量和标识符数学名词:变数或变量,是指没有固定的值,可以改变的数。变量以非数字的符号来表示,一般用拉丁字母。变量和常数是相反的。变量的用处在于能一般化描述指令的方式计算机解释:变量就是系统为程序分配的一块内存单元,用来储存各种类型的数据。根据所储存的数据类型不同,有......
  • Java面试相关问题
     一.MySql篇1优化相关问题1.1.MySql中如何定位慢查询? 慢查询的概念:在MySQL中,慢查询是指执行时间超过一定阈值的SQL语句。这个阈值是由long_query_time参数设定的,它的默认值是10秒1。也就是说,如果一条SQL语句的执行时间超过了long_query_time所设定的时间,那么这条SQL......
  • JAVA基本数据类型转换、关键字、转义字符
    基本数据类型转换自动类型转换:容量小的类型自动转换成容量大的数据类型byte,short,它们在计算时会转换int类型如果把int转换成float值,或者long转换成double值,不需要强制转换,但可能丢失精度publicclassMain{publicstaticvoidmain(String[]args){byteb......
  • 深入解析Mybatis-Plus框架:简化Java持久层开发(十二)
    ......
  • Java使用数据库连接池
    一、原生JDBC操作数据库的步骤(1)加载数据库驱动。(2)获取数据库连接。(3)预编译SQL语句。(4)执行SQL。(5)获取结果集。(6)释放资源。示例代码如下:publicclassJDBCTest{    publicstaticvoidmain(String[]args)throwsClassNotFoundException,SQLException......
  • Day01 文学生也想学java之今天我也许学能学会Markdown
    Day01文学生也想学java之今天我也许学能学会Markdown1.标题一级标题:#+(空格)+标题内容二级标题:##+(空格)+标题内容......(以此类推)2.字体helloworld!:前后两个*helloworld!:前后一个*helloworld!:前后三个*helloworld!:前后两个~3.引用这是一句引用:引用=>+(空格)4.分割线---+......
  • 毕业设计课题:实验室课程管理系统,基于java+SSM+mysql
          一、前言介绍     如今互联网发展迅猛,大量的信息都是通过网络这一渠道来传播,所以利用网络渠道来传播知识是非常有前景的。线上管理系统的主要目的是对实验室课程信息进行更有效的管理,光靠现有的管理方式是远远不够的,因此开发实验室课程管理系统是有必要的......
  • 毕业设计课题:少儿编程管理系统,基于java+SSM+mysql
          一、前言介绍     21世纪,我国早在上世纪就已普及互联网信息,互联网对人们生活中带来了无限的便利。像大部分的企事业单位都有自己的系统,由从今传统的管理模式向互联网发展,如今开发自己的系统是理所当然的。那么开发少儿编程管理系统意义和用处有哪些呢? ......
  • Jackson进行JSON序列化/反序列化添加Java 8的日期和时间库支持
     添加依赖包<!--Jackson进行JSON序列化/反序列化添加Java8的日期和时间库支持--> <dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> <version>2.13.0</version> ......