0-1背包问题

ad9cf1b9938d4750829bcb8dc53e5d9c.png

二维版:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;public class Main {static int N = 1010;static int[][] dp = new int[N][N];  //dp[i][j] 只选前i件物品,体积 <= j的最优解static int[] w = new int[N];    //存储价值static int[] v = new int[N];    //存储体积static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));public static void main(String[] args) throws IOException{String[] init = in.readLine().split(" ");int n = Integer.parseInt(init[0]);int Vmax = Integer.parseInt(init[1]);for(int i = 1;i <= n;i ++) {init = in.readLine().split(" ");v[i] = Integer.parseInt(init[0]);w[i] = Integer.parseInt(init[1]);}for(int i = 1;i <= n;i ++) {for(int j = 1;j <= Vmax;j ++) {if (v[i] > j) {     //当前背包装不下.最优解就是上一层的数据dp[i][j] = dp[i - 1][j];} else {//装得下的话,背包的价值会变成dp[i - 1][j - v[i]] + w[i]// j - v[i] 体积下的最优解 + w[i] 不一定会胜过dp[i - 1][j]dp[i][j] = Math.max(dp[i-1][j], dp[i - 1][j - v[i]] + w[i]);}}}System.out.print(dp[n][Vmax]);in.close();}
}

f[i][j]:只从前i个物品全,总体积<=j的最优解。局部最优=>全局最优

72293f298eb04c19bd7942e0313ab531.png

e41d401a4c5045b4b33e1fd9902f44ae.png

5f4d2867164c4fd8b9c37f4849e01955.png

a879dd06032d414c8eef5110fa1bd894.png

d2d86aa804a54262ab63fd293ce17c15.png

一维版

由模拟二维的过程可知,通过不断覆盖前一维的状态,只一维数组也能实现

并且,并不是一维里的所有数据都需要更新,所以可以更新二维起始下标

二维更改一维需要满足条件,在决策dp[i][j]时,要能够知道dp[i - 1][j - v[i]]的状态

要用的是一行的数据,不能用当前行的数据

263feaf30fbd4c3c920d8433206927e5.png

如表格中在决策第二件物品(v=2)时,dp[2]计算时,会把2更新成4,dp[4]计算时,需要用到上一次的2,而不是被更新过的4。所以决策时,每次都要用到前面的数据,但前面的数据又不能被改过。所以可以从后往前,可以确保你要决策的数,只被决策一次。

 

import java.io.*;
public class Main
{static int N = 1010;static int V;static int n;static int[] f = new int[N];   //只选前i件物品,背包容量为j的最优解static int[] v = new int[N];    //存体积static int[] w = new int[N];    //存价值static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));public static void main(String[] args)throws IOException{String[] init = in.readLine().split(" ");n = Integer.parseInt(init[0]);V = Integer.parseInt(init[1]);for(int i = 1;i <= n;i++){String[] data = in.readLine().split(" "); v[i] = Integer.parseInt(data[0]);w[i] = Integer.parseInt(data[1]);}for(int i = 1;i <= n;i++){  //从后往前决策, j < v[i] 的地方不需要更新,直接用上一次的数据for(int j = V;j >= v[i];j--){f[j] = Math.max(f[j],f[j-v[i]]+w[i]);}}System.out.println(f[V]);in.close();}
}

 

 

 

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

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

相关文章

Day03 嵌入式---中断

目录 一、简单介绍 二、总体框架 三、NVIC 3.2 NVIC的寄存器 3.3 中断向量表 3.4 中断优先级 3.5 NVIC优先级分组 3.6 NVIC配置 3.6.1、设置中断分组 3.6.2、初始化 四、EXTI 外部中断 4.1.EXTI的基本概念 4.2.EXTI的⼯作原理 4.3 EXTI配置 五、SYSCFG 5.1 SYS…

字符串函数`strlen`、`strcpy`、`strcmp`、`strstr`、`strcat`的使用以及模拟实现

文章目录 &#x1f680;前言&#x1f680;库函数strlen✈️strlen的模拟实现 &#x1f680;库函数strcpy✈️strcpy的模拟实现 &#x1f680;strcmp✈️strcmp的模拟实现 &#x1f680;strstr✈️strstr的模拟实现 &#x1f680;strcat✈️strcat的模拟实现 &#x1f680;前言 …

ReactJS和VueJS的简介以及它们之间的区别

本文主要介绍ReactJS和VueJS的简介以及它们之间的区别。 目录 ReactJS简介ReactJS的优缺点ReactJS的应用场景VueJS简介VueJS的优缺点VueJS的应用场景ReactJS和VueJS的区别 ReactJS简介 ReactJS是一个由Facebook开发的基于JavaScript的前端框架。它是一个用于构建用户界面的库&…

【C语言】——函数递归,用递归简化并实现复杂问题

文章目录 前言一、什么是递归二、递归的限制条件三、递归举例1.求n的阶乘2. 举例2&#xff1a;顺序打印一个整数的每一位 四、递归的优劣总结 前言 不多废话了&#xff0c;直接开始。 一、什么是递归 递归是学习C语言函数绕不开的⼀个话题&#xff0c;那什么是递归呢&#xf…

电商平台商品销量API接口,30天销量API接口接口超详细接入方案说明

电商平台商品销量API接口的作用主要是帮助开发者获取电商平台上的商品销量信息。通过这个接口&#xff0c;开发者可以在自己的应用或网站中实时获取商品的销量数据&#xff0c;以便进行销售分析、库存管理、市场预测等操作。 具体来说&#xff0c;电商平台商品销量API接口的使…

RocketMq集成SpringBoot(待完善)

环境 jdk1.8, springboot2.7.3 Maven依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.3</version><relativePath/> <!-- lookup parent from…

vue3 笔记 - 声明式 一

官网&#xff1a;Vue.js - 渐进式 JavaScript 框架 | Vue.js vue3编写有声明式和响应式。该文章仅记录声明式。vue3声明式与vue2相同。 一、生命周期 创建之前 beforeCreate()已创建 created()挂载之前 beforeMount()已挂载 mounted()销毁之前 beforeUnmount()已销毁 unmoun…

java面试-Dubbo和zookeeper运行原理

远离八股文&#xff0c;面试大白话&#xff0c;通俗且易懂 看完后试着用自己的话复述出来。有问题请指出&#xff0c;有需要帮助理解的或者遇到的真实面试题不知道怎么总结的也请评论中写出来&#xff0c;大家一起解决。 java面试题汇总-目录-持续更新中 分布式注册中心和服务调…

Unity中后处理简介

文章目录 前言一、后处理的原理二、我们看一下Unity文档中&#xff0c;内置的后处理前后的效果后处理前&#xff1a;后处理后&#xff1a; 前言 我们在这篇文章中&#xff0c;了解一下Unity中的后处理效果 后期处理概述 一、后处理的原理 在后处理的过程中&#xff0c;我们主…

Java当中常用的算法

文章目录 算法二叉树左右变换数据二分法实现 冒泡排序算法插入排序算法快速排序算法希尔排序算法归并排序算法桶排序算法基数排序算法分治算法汉诺塔问题动态规划算法引子代码实现背包问题 KMP算法什么是KMP算法暴力匹配KMP算法实现 今天我们来看看常用的算法&#xff0c;开干。…

《微信小程序开发从入门到实战》学习四十五

4.4 云函数 云函数是开发者提前定义好的、保存在云端并且将在云端运行的JS函数。 开发者先定义好云函数&#xff0c;再使用微信开发工具将云函数上传到云空间&#xff0c;在云开发控制台中可看到已经上传的云函数。 云函数运行在云端Node.js环境中。 小程序端通过wx.cloud.…

IP地址定位技术为网络安全建设提供全新方案

随着互联网的普及和数字化进程的加速&#xff0c;网络安全问题日益引人关注。网络攻击、数据泄露、欺诈行为等安全威胁层出不穷&#xff0c;对个人隐私、企业机密和社会稳定构成严重威胁。在这样的背景下&#xff0c;IP地址定位技术应运而生&#xff0c;为网络安全建设提供了一…

Python Selenium 自动登入1688

Python Selenium是一个用于自动化Web浏览器操作的库。它提供了一组功能强大的工具和API&#xff0c;可以模拟用户在浏览器中的行为&#xff0c;并执行各种任务&#xff0c;如点击、输入文本、提交表单等。 要使用Python Selenium登录1688网站&#xff0c;需要进行以下步骤&…

iOS微信小程序虚拟支付解决方案

众所周知&#xff0c;在IOS微信小程序不支持虚拟支付&#xff0c;一直是困扰IOS开发者、运营最头疼的问题&#xff0c;主要原因是苹果不允许IOS微信上架这类产品。导致微信小程序的开发者在IOS上都不能支付虚拟商品&#xff0c;虚拟商品包含了虚拟课程、会员、虚拟书等。 那么…

短视频ai剪辑分发矩阵系统源码3年技术团队开发搭建打磨

如果您需要搭建这样的系统&#xff0c;建议您寻求专业的技术支持&#xff0c;以确保系统的稳定性和安全性。 在搭建短视频AI剪辑分发矩阵系统时&#xff0c;您需要考虑以下几个方面&#xff1a; 1. 技术实现&#xff1a;您需要选择适合您的需求和预算的技术栈&#xff0c;例如使…

肖sir__ 项目讲解__项目数据

项目时间&#xff1a; 情况一&#xff1a;项目时间开始到上线的时间&#xff0c;这个时间一般比较长&#xff08;一年&#xff0c;二年&#xff0c;三年&#xff09; 情况二&#xff1a;项目的版本的时间或则是周期&#xff08;1个月&#xff0c;2个月&#xff0c;3个月&…

机器人、智能小车常用的TT电机/310电机/370电机选型对比

在制作智能小车或小型玩具时&#xff0c;在电机选型上一些到各种模糊混淆的概念&#xff0c;以及各种错综复杂的电机参数&#xff0c;本文综合对比几种常用电机的参数及特性适应范围&#xff0c;以便快速选型&#xff0c;注意不同生产厂家的电机参数规则会有较大差异。 普通TT…

论文阅读:PointCLIP: Point Cloud Understanding by CLIP

CVPR2022 链接&#xff1a;https://arxiv.org/pdf/2112.02413.pdf 0、Abstract 最近&#xff0c;通过对比视觉语言预训练(CLIP)的零镜头学习和少镜头学习在2D视觉识别方面表现出了鼓舞人心的表现&#xff0c;即学习在开放词汇设置下将图像与相应的文本匹配。然而&#xff0c;…

【ET8】2.ET8入门-ET框架解析

菜单栏相关&#xff1a;ENABLE_DLL选项 ET->ChangeDefine->ADD_ENABLE_DLL/REMOVE_ENABLE_DLL 一般在开发阶段使用Editor时需要关闭ENABLE_DLL选项。该选项关闭时&#xff0c;修改脚本之后&#xff0c;会直接重新编译所有的代码&#xff0c;Editor在运行时会直接使用最…

免费网页抓取工具大全【附下载和工具使用教程】

在当今信息爆炸的时代&#xff0c;获取准确而丰富的数据对于企业决策和个人研究至关重要。而网页抓取工具作为一种高效获取互联网数据的方式&#xff0c;正逐渐成为大家解决数据需求的得力助手。本文将深入探讨网页抓取工具的种类&#xff0c;并为大家提供简单实用的页面采集教…