小明的背包——01背包问题

经典版

题目链接:1.小明的背包1 - 蓝桥云课 (lanqiao.cn)

01背包问题中,每种物品只有两种状态,即拿或不拿。设状态dp[i][j]=max(dp[i-1][j],dp[i-1][j-w]+v);如果不拿物品i,那么最大价值就是dp[i-1][j],如果拿了就是从体积j-v转移过来,体积会变大w,价值增加v,最后输出dp[N][V]。

package lanqiao;import java.util.Scanner;/*** 2024/3/13* 背包容量为V,商场一共有N件物品,第i件物品的体积为wi,价值为vi* 求不超过体积的情况下所获得的最大价值为多少*/
public class lanqiao1174_小明的背包1 {public static void main(String[] args) {Scanner scan=new Scanner(System.in);int N=scan.nextInt();//物品个数int V=scan.nextInt();//背包容量int[] w=new int[N];//物品体积int[] v=new int[N];//物品价值for (int i=0;i<N;i++){//输入体积和价值w[i]=scan.nextInt();v[i]=scan.nextInt();}int[][] dp=new int[N+1][V+1];for (int i=1;i<=N;i++){for (int j=1;j<=V;j++){dp[i][j]=dp[i-1][j];if (j>=w[i-1]) {dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - w[i - 1]] + v[i - 1]);}}}System.out.println("最大价值为:"+dp[N][V]);}
}
5 20
1 6
2 5
3 8
5 15
3 3
最大价值为:37进程已结束,退出代码为 0

升阶版

01背包的优化

        首先有dp[i][j]=dp[i-1][j],相当于将dp[i-1]复制给dp[i],然后dp[i][j]=max(dp[i-1][j],dp[i-1][j-w]+v),每次下标都是从小转移到大,由此可以将第一维度优化掉,直接设置一个一维数组,每次更新都从后往前更新,即变为:dp[j]=max(dp[j],dp[j-w]+v),dp[j]表示此时物品总重量为j的情况下的最大价值

题目链接:1.背包与魔法 - 蓝桥云课 (lanqiao.cn)

设状态dp[i][j]表示物品总重量为i,且使用了j次魔法的情况下的最大值。

对于每个物品有三种选择:不选、选但不使用魔法、选且使用魔法

dp[j][0] = Math.max(dp[j][0], dp[j - w][0] + v);
dp[j][1] = Math.max(dp[j - w - K][0] + v * 2, dp[j][1]);

其中,dp[j][1]==dp[j][0];

最后输出

Math.max(dp[M][0], dp[M][1])
package lanqiao;import java.util.Scanner;/*** 2024/3/13* 小蓝有N件物品,其中第i件重量是Wi,价值是Vi。他有一个背包,最大承重是M* 求最多能装总价值多少的wupin* 其中,小蓝可以使用一个魔法,仅一次,将一件物品的重量增加K,同时价值翻倍,当然也可以不使用魔法*/
public class lanqiao2223_背包与魔法 {public static void main(String[] args) {Scanner scan = new Scanner(System.in);int N = scan.nextInt();//物品数量int M = scan.nextInt();//背包体积int K = scan.nextInt();//魔法增重int[] w = new int[N];int[] v = new int[N];for (int i = 0; i < N; i++) {w[i] = scan.nextInt();v[i] = scan.nextInt();}int[][] dp = new int[M + 1][2];//定义一个二维数组,一个表示未用魔法的,一个表示使用魔法的,dp[ ][0]   dp[ ][1]for (int i = 1; i <= N; i++) {for (int j = M; j >= 0; j--) {if (j >= w[i - 1]) {dp[j][0] = Math.max(dp[j][0], dp[j - w[i - 1]][0] + v[i - 1]);//未使用魔法的情况dp[j][1] = Math.max(dp[j][1], dp[j - w[i - 1]][1] + v[i - 1]);//通过将为使用魔法的数值复制存储,方便进行下面使用魔法情况的运算}if (j >= w[i - 1] + K) {//考虑使用魔法情况(上述将同一个结果分别存储在不同维度,也是为了此处计算不影响结果)dp[j][1] = Math.max(dp[j - w[i - 1] - K][0] + v[i - 1] * 2, dp[j][1]);}}}System.out.println("最大价值为:" + Math.max(dp[M][0], dp[M][1]));//比较使用魔法和未使用魔法的情况,输出较大的结果}
}
3 10 3
5 10
4 9
3 8
最大价值为:26进程已结束,退出代码为 0

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

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

相关文章

探索Java高并发编程之道:理论与实践

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 简介 随着互联网和信息技术的快速发展&#x…

【2024 R1 版本更新】Ansys Fluent(上)

​​Ansys2024R1来了&#xff0c;小宇赶紧将新功能给大家汇报一下。GPU求解器功能势头最强&#xff0c;pyFluent又开始迭代了&#xff0c;CPU模型中又更新了很多功能&#xff0c;fluent meshing中的thin volume mesh功能也来了。

libusb_Qt使用

Libusb libusb_github 建议直接下载库&#xff0c;编译好麻烦 QT调用 .pro文件添加&#xff1a; win32: LIBS -L$$PWD/LIB/libusb/x64/ -llibusb-1.0.cpp调用即可 #include "LIB/libusb/libusb.h" void class_name::fun(){/* 1. */libusb_init(NULL);/**/str…

python-YoloV5模型目标检测应用案例

YOLOv5 是一种非常流行的实时目标检测模型&#xff0c;它提供了出色的性能和精度。下面是一个使用 Python 和 YOLOv5 进行目标检测的基本应用案例。 步骤 1&#xff1a;安装 YOLOv5 和相关依赖 首先&#xff0c;确保你安装了所有必要的依赖。这通常包括 torch、torchvision 和…

mockjs学习

1.前言 最近面试发现之前团队协同合作的项目没有mock数据难以向面试官直接展示&#xff0c;所以迟到得来速学一下mockjs。 参考视频&#xff1a;mockJs 妈妈再也不用担心我没有后端接口啦_哔哩哔哩_bilibili 一开始查阅了一些资料&#xff0c;先是看了下EasyMock&#xff0c…

环保企业应适应行业发展趋势,不断创新和提升竞争力|中联环保圈

《2023年行业评述及2024年发展展望》一文&#xff0c;由中国环保产业协会撰写&#xff0c;全面审视了过去一年我国生态环保产业的发展状况&#xff0c;并对新的一年发展趋势进行了深度预测。该报告以行业主要政策标准为基础&#xff0c;结合报告以及新冠疫情防控转段后的经济恢…

突破编程_C++_查找算法(二分查找)

1 算法题 &#xff1a;使用二分查找算法在有序数组中查找指定元素 1.1 题目含义 给定一个升序排列的整数数组 nums 和一个目标值 target&#xff0c;写一个函数来搜索 nums 中的 target&#xff0c;如果目标值存在于数组中&#xff0c;则返回它的索引&#xff1b;否则返回 -1…

Cocos2dx-lua ScrollView[二]进阶篇

一.概述 本文缩写说明:sv = ScrollView, item代表ScrollView的一个子节点 如果对sv熟系程度还不够,请阅读基础篇: Cocos2dx-lua ScrollView[一]基础篇-CSDN博客 本文介绍sv的一种封装类库,来实现快速创建sv,有如下几个优点: 1.item的位置通过参数控制,提高开发效率…

使用Java自带的VisualVM监控远程服务器部署在Docker容器中的Java项目并使用Mat在线工具排查服务器内存泄露或内存溢出的原因

事情是这样的&#xff0c;我们项目最近应业主的要求迁移到了新的服务器&#xff0c;起初一切正常&#xff0c;部署、上线、测试都没有问题&#xff0c;项目大概运行了一周的工作日时间都没出现问题&#xff0c;直到周六那天&#xff0c;项目经理打电话过来说服务器崩了&#xf…

鼠标不动了怎么办?4招帮你解决问题!

“我在使用鼠标时&#xff0c;用着用着鼠标就动不了了&#xff0c;这是为什么呢&#xff1f;怎么才能让鼠标恢复正常呢&#xff1f;” 鼠标作为电脑使用中最常用的输入设备之一&#xff0c;其正常运行对于我们的工作效率至关重要。然而&#xff0c;有时我们可能会遇到鼠标突然不…

深入学习React开发:从基础到实战

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 引言 React是一款流行的JavaScript库&#xf…

C#重新认识笔记_ FixUpdate + Update

C#重新认识笔记_ FixUpdate Update Update: 刷新频率不一致,非物理对象的移动&#xff0c;简单的刷新可用&#xff0c; FixedUpdate: 刷新频率一致,按照固定频率刷新&#xff0c;一般调用FixedUpdate之后&#xff0c;会立即进入必要的物理计算中,因此&#xff0c;任何影响刚…

Union和union导致的数据不一致

平时工作中经常用到union&#xff0c;可以自带去重的操作&#xff0c;今天有个汇总的SQL也用了这个&#xff0c;需求是统计多张表的余额字段&#xff0c;看着就很简单union再sum或者sum再union。 第一种每张表先汇总&#xff0c;使用 UNION ALL 合并后最外层再汇总 SELECT SUM(…

【CSP试题回顾】201803-1-跳一跳

CSP-201803-1-跳一跳 解题代码 #include <iostream> using namespace std;int score, s, last_s -1;int main() {while (true){cin >> s;if (s 0) break;else if (s 1) {score s;last_s s;}else if (s 2) {if (last_s>2){score last_s;last_s 2;}else…

Python 界面逻辑分离示例

本示例使用的发卡设备&#xff1a;https://item.taobao.com/item.htm?id615391857885&spma1z10.5-c.w4002-21818769070.11.6cc85700Robi3x 一、Python 安装PyQt5&#xff0c;运行 Qt Designer 新建窗体文件&#xff0c;在窗体中拖放控件 完成界面设计&#xff0c;保存为…

克隆图00

题目链接 克隆图 题目描述 注意点 节点数不超过100每个节点值 Node.val 都是唯一的&#xff0c;1 < Node.val < 100无向图是一个简单图&#xff0c;这意味着图中没有重复的边&#xff0c;也没有自环图是连通图&#xff0c;可以从给定节点访问到所有节点 解答思路 本…

活动图高阶讲解-03

1 00:00:00,000 --> 00:00:06,260 刚才我们讲了活动图的历史 2 00:00:06,260 --> 00:00:11,460 那我们来看这个活动图 3 00:00:11,460 --> 00:00:15,260 如果用来建模的话怎么用 4 00:00:15,260 --> 00:00:20,100 按照我们前面讲的软件方法的工作流 5 00:00:20…

【网络安全】手机不幸被远程监控,该如何破解,如何预防?

手机如果不幸被远程监控了&#xff0c;用三招就可以轻松破解&#xff0c;再用三招可以防范于未然。 三招可破解可解除手机被远程监控 1、恢复出厂设置 这一招是手机解决软件故障和系统故障的终极大招。只要点了恢复出厂设置&#xff0c;你手机里后装的各种APP全部将灰飞烟灭…

STM32中断和外部中断

NVIC&#xff1a;嵌套中断向量控制器&#xff1a;用于统一分配中断优先级和管理中断 响应式优先级&#xff1a;也可以称为插队式优先级哪个优先级高优先处理哪个 抢占式优先级&#xff1a;优先级高的可以优先被处理&#xff0c;相当于CPU可以暂时中断当前处理的程序&#xff0c…

深入理解对话框管理器:自定义 TAB 按键行为

有人想开发这样一个功能,说界面上有一个多行文本编辑框,他希望用户按下 TAB 按键后可以将输入焦点导航至其他控件,而不是在文本框里默认地输入一个 TAB 字符。 如果是你,你觉得应该怎样做呢? 他琢磨了一下,觉得应该使用子类化的方式来实现这项功能,代码如下: >&g…