首页 > 编程语言 >【代码+详解】算法题 : 骨头收集者

【代码+详解】算法题 : 骨头收集者

时间:2024-06-16 18:02:36浏览次数:25  
标签:int 收集者 骨头 算法 详解 values volumes dp

❗❗❗必看:
下列题我全部都使用 Java 语言写的,并且均可以提交成功,获得Accepted 结果的. 如果代码和详解看了之后,对答案有任何疑问,都可以在评论区提出来,我都会一个一个回答.

❗❗❗感谢大家的支持,如果喜欢我的博客,关注 点赞 收藏 评论一波,非常感谢!!!

文章目录

题目:骨头收集者

许多年前,在泰迪的家乡,有一个被称为“骨头收集者”的人。这个人喜欢收集各种骨头,比如狗的、牛的,甚至还去坟墓……
骨头收集者有一个容积为V的大袋子,沿途收集骨头时有很多骨头,显然,不同的骨头有不同的价值和不同的体积,现在给定每个骨头沿途的价值,你能计算出骨头收集者能获得的最大总价值吗?

输入

第一行包含一个整数T,表示案例的数量。
接下来是T个案例,每个案例有三行,第一行包含两个整数N,V,(N <= 1000, V <= 1000)表示骨头的数量和他的袋子的容积。第二行包含N个整数,表示每个骨头的价值。第三行包含N个整数,表示每个骨头的体积。

输出

每行一个整数,表示最大的总价值(这个数字将小于2^31)。

测试样例

输入

1
5 10
1 2 3 4 5
5 4 3 2 1

输出

14

解释:

  • 前5个物品价值分别为1, 2, 3, 4, 5,体积分别为5, 4, 3, 2, 1。
  • 最大总价值为14,可以通过选择体积为1、2、3、4的物品实现。

这个问题是一个经典的“0/1背包问题”,可以使用动态规划来解决。我们需要计算每个案例中骨头收集者能够获得的最大总价值。以下是详细的步骤和代码实现。

代码

import java.util.Scanner;
//骨头收集者
public class Main{
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		int k = sc.nextInt();
		while(k-->0) {
			int N = sc.nextInt();//骨头的数量
			int V = sc.nextInt();//背包的容量
			int[] values = new int[N];//物品的价值
			int [] volumes = new int[N];//物品的重量
			
			for(int i = 0;i<N;i++) {
				values[i] = sc.nextInt();//为每个物品依次读入价值
			}
			for(int i= 0;i<N;i++) {
				volumes[i] = sc.nextInt();//为每个物品依次读入重量
			}
			int result = maxValue(N,V,values,volumes);
			System.out.println(result);
		}

	}

	private static int maxValue(int N, int V, int[] values, int[] volumes) {
		//创建一个二维数组,用来表示在前i个物品在容量不超过j的时候可以获得的最大价值
		int[][] dp = new int[N+1][V+1];
		for(int i = 1;i<=N;i++) {
			for(int j = 0;j<=V;j++) {
				dp[i][j] = dp[i-1][j];
				if(j>=volumes[i-1]) {
					dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - volumes[i - 1]] + values[i - 1]);  // 选第i个骨头
				}
			}
		}
		return dp[N][V];
	}

}

详解

初步思路

通过动态规划解决0/1背包问题,逐步计算每个物品在不同容量下的最大价值。

具体步骤

  1. 输入读取:

    • 首先读取案例数量T。
    • 对于每个案例,读取骨头数量N和背包容量V。
    • 读取每个骨头的价值数组values和体积数组volumes。
  2. 初始化DP表:

    • 创建一个二维数组dp,其中dp[i][j]表示前i个骨头在背包容量不超过j时的最大总价值。
    • 初始化dp数组为0,因为当没有物品或者容量为0时,最大价值为0。
  3. 填充DP表:

    • 遍历所有骨头,从第1个到第N个。
    • 对于每个骨头,从容量0到容量V,逐步更新dp表。
    • 更新规则:
      • 如果不选第i个骨头,dp[i][j] = dp[i-1][j]。
      • 如果选第i个骨头,dp[i][j] = max(dp[i][j], dp[i-1][j-volumes[i-1]] + values[i-1])。
  4. 输出结果:

    • 最后,dp[N][V]即为前N个骨头在容量为V时的最大总价值。
    • 对于每个案例,输出对应的最大总价值。

总结方法

动态规划是一种有效解决0/1背包问题的方法,通过构建和填充dp表,我们可以在多项式时间内求解该问题。此方法的关键在于理解和正确应用状态转移方程:在每一步都决定是否选择当前物品,从而保证最大总价值的累积。

标签:int,收集者,骨头,算法,详解,values,volumes,dp
From: https://blog.csdn.net/weixin_75202470/article/details/139656938

相关文章

  • (已校对)深入理解XGBoost:高效机器学习算法与进阶 (何龙)
    书:pan.baidu.com/s/1tGbGhhQ3Ez1SIkqdEREsjQ?pwd=eqp0提取码:eqp0XGBoost算法原理:XGBoost(ExtremeGradientBoosting)是一种基于梯度提升决策树的机器学习算法,其核心是通过多个弱学习器的组合来构建一个强学习器。梯度提升与决策树:XGBoost在每轮迭代中,通过计算每个样本的梯度和......
  • (pdf)数据结构与算法分析 Java语言描述=Data Structures and Algorithm Analysis in Jav
    书:pan.baidu.com/s/1tGbGhhQ3Ez1SIkqdEREsjQ?pwd=eqp0提取码:eqp0数组:作为最基本的数据结构,用于存储固定大小的同类型元素集合。链表:动态数据结构,允许在任意位置插入和删除元素。栈:后进先出(LIFO)的数据结构,常用于函数调用和表达式求值。队列:先进先出(FIFO)的数据结构,常用于任务调......
  • 字节跳动算法岗面试,问的贼细!
    节前,我们组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。汇总合集:《大模型面试宝典》(2024版......
  • 大模型算法岗 100 道面试题(含答案)
    节前,我们星球组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学.针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。汇总合集:《大模型面试宝典》(2024版)发......
  • 算法iITCGP的数值实验结果
    试验一:试验二: ......
  • Pytest框架中fixture功能详解
    文章目录1定义Fixture函数2Fixture的函数参数2.1传入其他fixture函数作为参数2.2传入request对象参数示例1:访问fixture的调用者示例2:使用fixture的参数3Fixture的作用域参数scope3.1scope=class场景3.2scope=session场景4Fixture的自动使用参数autouse=......
  • Redis分布式锁详解及电商秒杀功能示例
    Redis分布式锁是一种在分布式系统中,利用Redis的原子操作特性实现的锁机制,用于保护共享资源的并发访问。原理原子性与互斥性Redis分布式锁的核心原理在于利用Redis的某些原子操作(如`SETNX`、`GETSET`、`SET`带特定选项等)来确保锁的获取与释放操作是原子性的,从而保证了锁的......
  • Unreal RecastNavigation 开源项目详解
    0前言Recastnavigation是一个游戏AI导航库,像Unity,UE引擎中都集成了这个开源项目,HALO中使用的也是这个开源库。导航最重要的就是为NPC寻路,以及其他的寻路需求。需要注明的是,这个寻路库虽然厉害。但是他的核心是平面寻路。也就是重力方向一直朝着-Y方向。如果是星球地形,既重......
  • 算法人生(22):从“生成对抗网络”看“逆商提升”
    ​在图像生成与编辑、音频合成、视频生成领域里,有一个非常重要的深度学习方法——生成对抗网络(简称GANs),它是由两个神经网络组成的模型,分别为生成器(Generator)和判别器(Discriminator),这两个网络相互博弈,通过对抗学习的方式来训练,以便生成逼真的数据样本。它的大致步骤如下:初始......
  • (书和笔记)学习JavaScript数据结构与算法(第3版) ([巴西] 洛伊安妮 • 格罗纳)
    书:pan.baidu.com/s/199LHxxIlMixw3gYSY8tyPw?pwd=ywxg提取码:ywxg数据结构与算法基础:介绍了数据结构与算法的基本概念、重要性以及它们在JavaScript中的应用。数组:深入讲解了数组的定义、操作、常用方法及其在JavaScript中的应用,包括多维数组的构建与访问。栈:详细阐述了栈的概......