01背包问题 AcWing(JAVA)

news2025/2/26 9:56:58

有 N件物品和一个容量是 V的背包。每件物品只能使用一次。

第 i件物品的体积是 vi,价值是 wi。

求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。

输入格式 

第一行两个整数,N,V用空格隔开,分别表示物品数量和背包容积。

接下来有 N行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 件物品的体积和价值。

输出格式 

输出一个整数,表示最大价值。

数据范围: 

0<N,V≤1000
0<vi,wi≤1000 

输入样例: 

4 5

1 2

2 4

3 4 

4 5 

输出样例: 

注意:本题比较坑的地方就是物品的体积和价值不唯一,可以重复,如果想不到动态规划用暴力解法的话要注意。 

朴素版动态规划如下:

import java.util.*;
 
public class Main {
	public static int N = 1010;
    public static void main(String[] args) {
      Scanner sc = new Scanner(System.in);
      int v[] = new int[N];
      int M[] = new int[N];
      int f[][] = new int[N][N];//代表函数f(i,j)=price,其意义是考虑前i件物品,且背包体积为j时所能装入的最大价值
      int n = sc.nextInt();
      int m = sc.nextInt();//物品数,体积
      for(int i = 1; i <= n; i ++) {
    	 v[i] = sc.nextInt();
    	 M[i] = sc.nextInt();
      }
      for(int i = 1; i <=n; i++)//i代表考虑前i件物品
    	  for(int j = 0; j <=m; j++) {//j表示背包体积为j时(体积可以为零0,所以由0开始)
    	     f[i][j] = f[i-1][j];//不装入第i件物品
    	     if(j >= v[i]) f[i][j] = Math.max(f[i][j], f[i - 1][j - v[i]] + M[i]);//装入第i件物品
    	  }//由初始往上递推,储存了必要值。
      System.out.print(f[n][m]);
	  }
}

c08101c9035c4508abf85a81492afcd3.png 实在没事思路可以在:对应01背包问题后方找这位大哥的视频讲解

精华版(不好理解,由上述代码优化而来,思路完全一样):

import java.util.*;
 
public class Main {
	public static int N = 1010;
    public static void main(String[] args) {
      Scanner sc = new Scanner(System.in);
      int v[] = new int[N];
      int M[] = new int[N];
      int f[] = new int[N];
      int n = sc.nextInt();
      int m = sc.nextInt();
      for(int i = 1; i <= n; i ++) {
    	  v[i] = sc.nextInt();
    	  M[i] = sc.nextInt();
      }
      for(int i = 1; i <= n;i++)
    	  for(int j = m; j >= v[i]; j--) f[j] = Math.max(f[j], f[j - v[i]] + M[i]);
      System.out.print(f[m]);
	  }
}

01背包本质上:由简单到易计算并记录每一个状态的最优解,根据记录的最优解推广到下一个状态的最优解,就这样层层递推。

递推:对于第i件物品,无非分为装与不装两个状态,装入就先装第i件物品,再查找剩下背包状态最优解并相加。不装就是取记录的i - 1件物品最优解。两者取最大即新状态最优解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/347548.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构与算法(一):概述

数据结构学了有一年左右的时间了&#xff0c;但是一直没有详细地总结一下&#xff0c;现在回想起来&#xff0c;感觉有些内容忘记了。所以接下来一段时间我将重新归纳总结一下&#xff0c;算是温故而知新了。 一、数据结构 1、定义 数据结构是计算机存储、组织数据的方式。在…

excel学习笔记-导入外部文件,报错,数值格式变换,日期格式的转化,求和快捷键,冻结窗格

这里写目录标题一、导入外部文件1.导入csv文件2.导入txt文件3.修改txt内容&#xff0c;需要刷新才能看见更改二、报错三、数值格式变换四、日期格式的转化五、ALT &#xff0c;求和快捷键六、冻结窗格一、导入外部文件 1.导入csv文件 2.导入txt文件 3.修改txt内容&#xff0c;…

内网渗透(三十)之横向移动篇-利用远控工具向日葵横向移动

系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…

力扣sql简单篇练习(十六)

力扣sql简单篇练习(十六) 1 产品销售分析|| 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 SELECT p.product_id,sum(s.quantity) total_quantity FROM Product p INNER JOIN Sales s ON p.product_ids.product_id GROUP BY p.product_id1.3 运行截…

explain 每个列的含义

官网传送门&#xff1a;https://dev.mysql.com/doc/refman/5.7/en/explain-output.html 实例表 DROP TABLE IF EXISTS actor;CREATE TABLE actor (id int(11) NOT NULL,name varchar(45) DEFAULT NULL,update_time datetime DEFAULT NULL,PRIMARY KEY (id)) ENGINEInnoDB DEFA…

【Java项目】基于Java+MySQL+Tomcat+maven+Servlet的个人博客系统的完整分析

✨哈喽&#xff0c;进来的小伙伴们&#xff0c;你们好耶&#xff01;✨ &#x1f6f0;️&#x1f6f0;️系列专栏:【Java项目】 ✈️✈️本篇内容:个人博客系统前后端分离实现&#xff01; &#x1f680;&#x1f680;个人代码托管github&#xff1a;博客系统源码地址&#xff…

maven解决包冲突简单方式(插件maven helper | maven指令)

文章目录使用idea插件maven helper使用maven指令在Java开发中&#xff0c;常常会遇到不同jar包之间存在冲突的情况&#xff0c;这可能会导致编译错误、运行时异常等问题。 使用idea插件maven helper 在idea安装插件maven helper 安装重启完之后点击pom文件&#xff0c;有一个De…

元宇宙基础设施:WEB 3.0 chain33 优势分析

WEB 3.0 chain33 优势分析 一、与以太坊兼容&#xff08;优势&#xff1a;兼容及开发成本低百倍&#xff09; 使用 Solidity 开发智能合约并部署在 EVM 虚拟机上是目前以太坊生态主流的开发 模式&#xff0c;目前看来不兼容以太坊或不能与以太坊跨链都可能是不归路&#xff0c;…

AcWing语法基础课笔记 第一章 C++入门及简单的顺序结构

第一章 C入门及简单的顺序结构 编程是一种控制计算机的方式&#xff0c;和我们平时双击打开文件、关机、重启没有任何区别。 ———闫学灿 C中常用的变量类型 和所占字节大小 输出变量地址符&#xff1a; 软件环境 作业的评测与提交 在线练习地址&#xff1a;www.acwing.com …

数据库设计的基本步骤

分步设计法遵循自顶向下、逐步求精的原则&#xff0c;将数据库设计过程分解为若干相互独立又相互依存的阶段&#xff0c;每一阶段采用不同的技术与工具&#xff0c;解决不同的问题&#xff0c;从而将问题局部化&#xff0c;减少了局部问题对整体设计的影响。目前&#xff0c;此…

aws Distro for OpenTelemetry 可观测性workshop记录

参考资料 https://aws-otel.github.io/docs/introductionhttps://aws-otel.github.io/docs/introduction aws distro for opentelemetry 官方提供了不同语言不同使用场景下完善的使用实例和相关配置。 AWS Distro for OpenTelemetrics 由以下部分组成&#xff0c;用于向后端…

用户认证概述

文章目录一、用户身份认证1.1 单一服务器模式1.2 SSO&#xff08;Single Sign On&#xff09;模式1.3 Token模式二、JWT令牌2.1 JWT 令牌说明2.2 JWT令牌的组成2.3 JWT 问题和趋势2.4 JWT 测试一、用户身份认证 1.1 单一服务器模式 一般过程如下&#xff1a; 用户向服务器发送…

【编程基础之Python】5、安装Python第三方模块

【编程基础之Python】5、安装Python第三方模块安装Python第三方模块为什么需要安装第三方模块Python包管理器介绍pippip installpython -m pip installcondaconda install在Windows环境中安装Python模块安装numpy安装pandas安装matplotlib在Linux环境中安装Python模块在PyCharm…

线程的创建

1. 多线程常用函数 1.1 创建一条新线程pthread_create 对此函数使用注意以下几点&#xff1a; 线程例程指的是&#xff1a;如果线程创建成功&#xff0c;则该线程会立即执行的函数。POSIX线程库的所有API对返回值的处理原则一致&#xff1a;成功返回0&#xff0c;失败返回错误…

NLP实践——知识图谱问答模型FiD

NLP实践——知识图谱问答模型FiD0. 简介1. 模型结构2. 召回3. 问答4. 结合知识的问答0. 简介 好久没有更新了&#xff0c;今天介绍一个知识图谱问答&#xff08;KBQA&#xff09;模型&#xff0c;在此之前我一直在用huggingface的Pipeline中提供的QA模型&#xff0c;非常方便但…

低代码和零代码的有什么不同?如何区分?

低代码开发平台和零代码平台的区别是什么&#xff1f;一个例子就能讲清楚&#xff01; 周末你外出露营&#xff0c;在野外需要搭一个帐篷。有两种方法&#xff1a; 一种是最原始的搭帐篷方法&#xff0c;即有隔水布、外账、内账、营柱骨架等等......另一种是直接“封装好”的…

OpenCV-PyQT项目实战(5)项目案例01:图像模糊

欢迎关注『OpenCV-PyQT项目实战 Youcans』系列&#xff0c;持续更新中 OpenCV-PyQT项目实战&#xff08;1&#xff09;安装与环境配置 OpenCV-PyQT项目实战&#xff08;2&#xff09;QtDesigner 和 PyUIC 快速入门 OpenCV-PyQT项目实战&#xff08;3&#xff09;信号与槽机制 …

PySpark实战一之入门

1、PySpark的编程模型 分三个模块&#xff1a; 数据输入&#xff1a;通过SparkContext对象&#xff0c;完成数据输入 数据处理计算&#xff1a;输入数据后得到RDD对象&#xff0c;对RDD对象的成员方法进行迭代计算 数据输出&#xff1a;最后通过RDD对象的成员方法&#xff0…

互联网行业固定资产智能化解决方案为企业降本增效

互联网行业的固定资产数量和种类往往比较多&#xff0c;来源可能是租赁、购入、调拨等。主要分为&#xff1a;办公设备、电子设备、服务器等。固定资产是互联网企业的重要资产之一&#xff0c;是企业持续经营的物质基础。因此&#xff0c;对于实物资产的管理尤为重要。 互联网…

搭建zookeeper高可用集群详细步骤

目录 一、虚拟机设置 1.新建一台虚拟机并克隆三台&#xff0c;配置自定义 2.修改四台虚拟机的主机名并立即生效 3.修改四台虚拟机的网络信息 4.重启四台虚拟机的网络服务并测试网络连接 5.重启四台虚拟机&#xff0c;启动后关闭四台虚拟机的防火墙 6.在第一台虚拟机的/e…