63、背包问题

背包问题

题目描述

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

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

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

输入格式

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

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

输出格式

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

数据范围

  • 0 < N , V ≤ 1000 0 < N,V ≤ 1000 0<N,V1000
  • 0 < v i , w i ≤ 1000 0<vi,wi≤1000 0<vi,wi1000
输入样例
4 5
1 2
2 4
3 4
4 5
输出样例:
8

Solution

思路

  • 状态:dp[i][j]表示只看前i个物品,总体积不超过j的情况下,背包中物品的最大价值

    最后答案就是dp[N][V]

  • 状态转移:找最后一个不同点,也就是选最后一个物品的不同方案。对于dp[i][j]有两种情况:

    1. 不选择当前的第件物品/第i件物品比背包容量要大

      dp[i][j] = dp[i-1][j]

    2. 选择当前的第i件物品(潜在要求第i件物品体积小于等于背包总容量,即v[i] >= j

      dp[i][j] = dp[i-1][j-v[i]] + w[i]

    上面两种情况取max作为当前的最优解。

  • 边界:dp[0][0] = 0

  • 注意一些细节:

    1. 如果j表示体积正好是j的话,那么答案就需要遍历求max。如果表示的是 不超过j的话,答案就是dp[N][V]
    2. 如果题目要求背包必须放满,那么 dp[0] [0…V] 中仅仅有 dp[0][0] 为0,其余值需被设置为-INF,返回dp[V]。
    3. 如果并没有要求必须把背包装满,而是只希望总价值尽量大,初始化时应该将dp[0...V ]全部设为0, 返回dp[V]。
    4. ij从1开始循环。

普通版

import java.util.*;class Main{public static void main(String[] args){// 输入数据Scanner scan = new Scanner(System.in);int N = scan.nextInt();int V = scan.nextInt();int[] v = new int[N + 10];int[] w = new int[N + 10];for(int i = 1; i <= N; i++){v[i] = scan.nextInt();w[i] = scan.nextInt();}scan.close();// 开始dpint[][] dp = new int[N + 10][V + 10];for(int i = 1; i <= N; i++){for(int j = 1; j <= V; j++){// 放进去和不放进去取最大值dp[i][j] = dp[i - 1][j];if(j >= v[i])dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - v[i]] + w[i]);}}// int res = 0;// for(int i = 0; i <= V; i++) res = Math.max(res, dp[N][i]);// System.out.println(res);// 或者System.out.println(dp[N][V]);}
}

进阶版

  1. dp[j]表示体积不超过j的情况下的最大价值。
  2. dp[i][j] = max(dp[i-1][j], dp[i-1][j-v[i]] + w[i]),看j,第二维要不就是用j,要不是就是用比j小的数。
  3. 如果j从小往大循环,后面的dp[j]可能已经被前面的更新了,相当于dp[i][j - v[i]]
  4. 所以让j从大到小循环。把第一维去掉,变成了dp[j] = max(dp[j], dp[j-v[i] + w[i]),比如计算第二层的时候,dp[j-v[i]]还没有在第二层被更新过(因为j-v[i]j小),所以这个时候的dp[j-v[i]]存的是上一层的状态,也就是dp[i-1][j-v[i]]
import java.util.*;class Main{public static void main(String[] args){// 输入数据Scanner scan = new Scanner(System.in);int N = scan.nextInt();int V = scan.nextInt();int[] v = new int[N + 10];int[] w = new int[N + 10];for(int i = 1; i <= N; i++){v[i] = scan.nextInt();w[i] = scan.nextInt();}scan.close();// 开始dpint[] dp = new int[V + 10];for(int i = 1; i <= N; i++){for(int j = V; j >= v[i]; j--){// 放进去和不放进去取最大值dp[j] = Math.max(dp[j], dp[j - v[i]] + w[i]);}}// 如果初始化:dp[0]为0,其他为负无穷,就要遍历取最大值。// 这种情况对应体积恰好为V的价值,保证所有的状态从0转移来//// 如果初始化:dp[i]都为0,dp[V]也是最大值。假设dp[k]为最大值。// dp[k]从0转移过来,那dp[V]从dp[V-k]转移过来,是一样的System.out.println(dp[V]);}
}

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

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

相关文章

spring中那些地方使用了反射

1、依赖注入&#xff08;Dependency Injection&#xff09; Spring Boot通过反射机制将bean注入到相应的属性或构造函数中。当我们在Spring Boot中使用如Autowired这样的注解时&#xff0c;Spring容器会利用反射机制找到相应的bean并注入到对应的属性或构造函数中。 2、Bean的…

ARM服务器在云手机中可以提供哪些支持

ARM服务器作为云手机的底层支撑&#xff0c;在很多社媒APP或者电商APP平台都有着很多看不见的功劳&#xff0c;可以说ARM扮演着至关重要的底层支持角色&#xff1b; 首先&#xff0c;ARM 服务器为云手机提供了强大的计算能力基础。云手机需要处理大量的数据和复杂的运算&#x…

Java Web框架使用经验

在Java Web开发领域&#xff0c;框架的使用极大地提高了开发效率和代码的可维护性。我个人的开发经验中&#xff0c;涉及了多个Java Web框架&#xff0c;其中最为常用和熟悉的包括Spring MVC、Spring Boot以及Struts2。下面我将从技术难点、面试官关注点、回答吸引力以及代码举…

标题:Python中的箭头符号 “->“:一个简单而强大的功能

基本原理 在Python中&#xff0c;箭头符号 “->” 通常出现在函数定义中。这个符号是Python 3.8版本引入的&#xff0c;它用于定义函数时&#xff0c;将参数和返回类型分开&#xff0c;使得函数的接口更加清晰。这种语法被称为类型提示&#xff08;Type Hints&#xff09;&…

微服务第一轮

课程文档 目录 一、业务流程 1、登录 Controller中的接口&#xff1a; Service中的实现impl&#xff1a; Service中的实现impl所继承的接口IService&#xff08;各种方法&#xff09;&#xff1a; VO&#xff1a; DTO&#xff1a; 2、搜索商品 ​Controller中的接口&a…

【亚马逊云科技 CSDN 联合巨献】 「对话AI 构建者:从基础到应用的 LLM 全景培训」 限时免费!

&#x1f680;&#x1f31f;【亚马逊云科技 & CSDN 联合巨献】 &#x1f4da;「对话AI 构建者&#xff1a;从基础到应用的 LLM 全景培训」&#x1f525; 限时免费&#xff01; &#x1f4c6; 抓紧时间&#xff01;6月7日前注册&#xff0c;原价 399&#xff0c;现在仅需 0…

在Web应用中如何处理会话跟踪

在Web应用中&#xff0c;会话跟踪是一个至关重要的功能&#xff0c;它允许服务器在多个请求之间识别并跟踪特定的用户。通过会话跟踪&#xff0c;服务器能够维持用户的状态信息&#xff0c;从而为用户提供个性化服务&#xff0c;比如保存购物车信息、实现登录状态保持等。然而&…

C基础与SDK调试方法

REVIEW 上次学习了一下软件使用流程zynq PS点灯-CSDN博客 本次学习一下C编程基础与调试方法 1. 硬件编程原理 小梅哥视频链接&#xff1a; 07_Xilinx嵌入式裸机硬件编程原理_哔哩哔哩_bilibili 对应的课程笔记&#xff1a;【zynq课程笔记】【裸机】【第7课 】【硬件编程原理…

C++ STL - 容器

C STL&#xff08;标准模板库&#xff09;中的容器是一组通用的、可复用的数据结构&#xff0c;用于存储和管理不同类型的数据。 目录 零. 简介&#xff1a; 一 . vector&#xff08;动态数组&#xff09; 二. list&#xff08;双向链表&#xff09; 三. deque&#xff08…

yolov8摔倒检测(包含数据集+训练好的模型)

基于先进的YOLOv8模型&#xff0c;实现了一套高效可靠的人体摔倒检测系统。YOLOv8作为YOLO系列的最新成员&#xff0c;以其卓越的检测速度和准确性&#xff0c;在计算机视觉领域尤其是目标检测任务中表现出色。本系统不仅能够实时处理视频流或监控画面&#xff0c;还能对静态图…

SwiftUI中Menu和ControlGroup的使用

本篇文章主要介绍一下Menu组件和ControlGroup组件的使用。Menu组件是在iOS 14&#xff08;tvOS 17&#xff09;推出的一个组件&#xff0c;点击后提供一个可选择的操作列表。ControlGroup组件是一个容器视图&#xff0c;以视觉上适当的方式为给定的上下文显示语义相关的控件&am…

【面试干货】SQL语言分类

【面试干货】SQL语言分类 1、数据查询语言&#xff08;DQL&#xff09;2、数据操纵语言&#xff08;DML&#xff09;3、数据定义语言&#xff08;DDL&#xff09;4、数据控制语言&#xff08;DCL&#xff09;5、结语 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收…

使用gradio库实现Web应用,允许用户上传图像,并使用YOLOv8模型对图像进行目标检测。

一、Gradio Gradio 详细介绍 Gradio 是一个用于构建和分享机器学习模型和数据科学应用的开源Python库。它简化了创建交互式Web界面的过程&#xff0c;让开发者可以快速搭建原型并与他人分享。 主要特性 易用性&#xff1a; 无需前端开发经验&#xff1a;只需几行Python代码就…

服务器端口聚合

服务器网口的band模式主要涉及到网卡绑定&#xff08;bonding&#xff09;技术&#xff0c;该技术将两个或更多的物理网卡绑定成一个虚拟网卡&#xff0c;从而实现本地网卡的冗余、带宽扩容和负载均衡。在服务器网络配置中&#xff0c;这种技术有助于提高网络连接的稳定性和性能…

论工业交换机的工业级芯片的重要性

工业交换机作为工业网络中的重要设备&#xff0c;其性能和稳定性对整个工业生产过程至关重要。而工业级芯片作为工业交换机的核心组成部分&#xff0c;更是承载着重要的功能和责任。工业级芯片具有承受恶劣环境的能力&#xff0c;能够在高温、高压、强电磁干扰等恶劣条件下稳定…

html+CSS+js部分基础运用15

1、完成输入框内容的实时反向输出。 2、银行账户余额变动自动通知项目。 设计要求&#xff1a;单击按钮后&#xff0c;余额按照输入框的数额减少&#xff0c;同时将按钮式的提示信息&#xff08;金额&#xff09;同步改变。利用侦听属性实现余额发生变化时发出提示信息&#x…

Django render()函数页面渲染

1&#xff0c; render() 函数 在Django框架中&#xff0c;render() 函数是一个非常有用的快捷方式&#xff0c;用于从视图函数返回一个完整的HTTP响应。它负责将给定的模板与上下文数据结合&#xff0c;渲染出最终的HTML页面&#xff0c;并返回一个HttpResponse对象。 from d…

全能大模型AIGC产品的使用体验、选择倾向与未来展望

随着人工智能技术的迅猛发展&#xff0c;AIGC&#xff08;人工智能生成内容&#xff09;领域正迎来前所未有的繁荣。其中&#xff0c;全能大模型产品以其强大的生成能力和广泛的应用场景&#xff0c;吸引了众多用户的关注。腾讯元宝APP的上线更是为这一领域注入了新的活力。本文…

第10周 企业认证、分布式事务,分布式锁方案落地

第10周 企业认证、分布式事务,分布式锁方案落地 1. 基于Redis提高请求响应**********************************************************************************************本周我们将对企业入驻认证的流程进行落地,并且结合分布式缓存中间件Redis与Redisson进行相关的技术…

企业(园区)智慧能源双碳平台解决方案

园区作为工业企业集聚区&#xff0c;在提供了大量基础设施和公共服务的同时也成为了碳排放的主要源头。工业园区的耗能约占全社会总耗能的69%&#xff0c;碳排放占全国总排放约31%。工业园区节能、减耗、提质、减碳工作的落实&#xff0c;是我国实现碳达峰碳中和目标的必然要求…