01背包问题(滚动数组实现的逻辑)

2023-05-16

package tttest;

public class mybetterbag {
	public static void main(String[] args)
	{
		int[] weight = {1,3,4};
		int bagsize = 4;
		int[] value = {15,20,30};
		happy(weight,value,bagsize);
	}
	public static void happy(int[] weight,int[] value,int bagsize)
	{
		//我们使用滚动数组来帮我们解决这道题
		//第一步,先定义dp,并且明确dp的含义
		int[] dp = new int[bagsize+1];
		//这里我们的dp意思是容量为i的背包,最多能装价值为dp[i]的东西
		//我们为什么使用一维数组而不使用二维数组呢?
		//我们使用一维数组的原理是什么呢?
		//我们先看二维数组时,我们的代码
		//dp[i][j] = Math.max(dp[i-1][j],dp[i-1][j-weight[i]]+value[i])、
		//如果我们把i-1行直接复制到i行
		//则变成 dp[i][j] = Math.max(dp[i][j],dp[i-weight[i]][j]+value[i])
		//因为我们提前赋值了,如果,我们的值不变化,那么我们dp[i][j]的值就不变
		//本来是等于dp[i-1][j]的值,但是由于我们已经赋过值了,我们dp[i][j]的值本来就是dp[i-1][j]的值了
		//所以,我们就可以不变
		//与其我们把上一行的数值赋给下一行,不如我们直接在这一行进行修改
		//我们dp[j] = Math.max(dp[j],dp[j-weight[i]]+value[i])
		//当我们来到dp[j]的时候,我们dp[j]里面的值就是上一轮dp中的值,如果我们不加新物品,那么我们dp[j]的值就不用修改
		//所以,dp[j]中的值就不改变
		//但是如果我们的值需要修改呢?那么,我们的dp[j] = dp[j-weight[i]]+value[i]
		//大家回想一下,如果我们的dp[j]需要改变,在二维数组里面我们是怎么做的?
		//dp[i][j] = dp[i-1][j-weight[i]]+value[i]
		//我们为了方便,拿数组的本身来记录上一层的对应值,所以,我们的dp[j] = dp[j-weight[i]]+value[i]
		//但是这里还需要注意很重要的一点!!
		//我们拿数组本身记录上一层的数据,那么我们的数组j修改过后,就不再是上一层的数据了,他就变成这一层的数据了
		//如果我们选择从前往后遍历的话,当j-weight[i]回到前面的数据时,我们得到的不是我们想要到上一层数据,而是从上一层数据经过变化来到的本层的数据
		//这就不好了!,我们本来是dp[i-1][j-weight[i]]+value[i]
		//如果我们从前往后遍历的话,就成为了dp[i][j-weight[i]] + value[i]
		//这显然不对,为了避免使用被改变的数据,我们从后往前遍历
		//这样被修改的数据也是从后往前
		//就不用担心层数的问题了!
		for(int i = 0;i<weight.length;i++)
		{
			for(int j = bagsize;j>=weight[i];j--)
			{
				dp[j] = Math.max(dp[j],dp[j-weight[i]]+value[i]);
			}
		}
		System.out.println(dp[bagsize]);
	}
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

01背包问题(滚动数组实现的逻辑) 的相关文章

  • UART的FIFO功能

    经常听到UART的FIFO功能 xff0c 但是从来没有真正使用过和认真思考过它的作用 正好有客户用到这个功能 xff0c 在这里做个总结 FIFO 是 First In First Out 的缩写 xff0c 它是一个具有先入先出特点的缓
  • 《C语言内核深度解析》笔记(3):指针才是C语言的精髓

    第03章 指针才是C语言的精髓 3 2 指针 int a 61 10 int p 61 amp a 指针变量p和普通变量之间没有本质区别 xff0c 都是变量空间放了一个数值 xff0c 只是p里面的数值比较特殊 xff0c 是a空间的地址
  • 相机针孔模型----从世界坐标系,到相机坐标系,再到图像物理坐标系,最后到图像像素坐标系的转换过程解析

    看了很多讲解针孔相机模型中从世界坐标系 gt 到相机坐标系 gt 图像坐标系的文章 xff0c 心里的疑惑也逐渐展开 xff0c 现在总结一下自己的理解 xff1a 世界坐标系 相机坐标系 图像物理坐标系 图像像素坐标系在我的另一篇博文里已
  • D1 R32 – ESP32+Arduino CNC Shield控制步进电机

    陈拓 2023 04 01 2023 04 05 1 简介 在 Arduino Uno开发板 43 电机驱动扩展版CNC Shield V3 0硬件说明 https blog csdn net chentuo2000 article det
  • pixhawk当中关于NMEA类型的gps数据处理流程

    1 启动跟新gps的数据的任务是在ArduCopter cpp中scheduler tasks中 调用的速度是50hz 2 通过执行update GPS方法中的 3 调转到ap gps cpp中的update方法中 4 在update中通过
  • C++Eigen库的配置和基本使用

    1 配置 1 下载 http bitbucket org eigen eigen get 3 2 5 tar bz2 2 配置 文件夹名字较长 xff0c 解压后可重命名 xff0c 如我命名为eigen3 xff0c 把D program
  • C++:extern "c"用法解析

    引言 C 43 43 保留了一部分过程式语言的特点 xff0c 因而它可以定义不属于任何类的全局变量和函数 但是 xff0c C 43 43 毕竟是一种面向对象的程序设计语言 xff0c 为了支持函数的重载 xff0c C 43 43 对全
  • 堆栈的作用,以及存放的数据

    在计算机领域 xff0c 堆栈是一个不容忽视的概念 xff0c 但是很多人甚至是计算机专业的人也没有明确堆栈其实是两种数据结构 堆栈都是一种数据项按序排列的数据结构 xff0c 只能在一端 称为栈顶 top 对数据项进行插入和删除 要点 x
  • STM32 姿态传感器mpu6050的使用

    文章目录 特性引脚说明使用I2C软件 xff0c 驱动mpu6050手册中寄存器描述MPU6050初始化的步骤 xff1a 数据读取mpu6050输出的值 特性 MPU6050 xff0c 能同时检测三轴加速度 三轴陀螺仪 三轴角速度 的运

随机推荐