蓝桥杯每日一题------背包问题(三)

news2024/11/16 16:23:57

前言

之前求的是在特点情况下选择一些物品让其价值最大,这里求的是方案数以及具体的方案。

背包问题求方案数

在这里插入图片描述
既然要求方案数,那么就需要一个新的数组来记录方案数。动态规划步骤如下,
定义dp数组
第一步:缩小规模。考虑n个物品,那我就先考虑1个物品,在考虑2个物品…,需要一个维度表示当前考虑的物品个数。
第二步:限制。所选物品个数不能超过物品容量,那么需要一个维度记录当前背包的容量。
第三步:写出dp数组。f[i][j]表示当前考虑了前i个物品,背包容量为j价值最大时的方案数。
第四步:推状态转移方程。f[i][j]应该从哪里转移过来呢,必然是从前i-1个物品转移,我要考虑两种情况,对于第i个物品,可以选择要它,也可以不要它。
(1)如果要第i个物品,f[i][j]=f[i-1][j-v[i]]。
(2)如果不要第i个物品,f[i][j]=f[i-1][j]。
(3)如果要和不要都可以获得最大价值,f[i][j]=f[i-1][j-v[i]]+f[i-1][j]。
那么在原先的dp数组进行转移的时候,我们要记录他到底是从哪个状态转移过来的,不能只单纯取一个最大值。代码如下。

int l = dp[j];
			int r = dp[j-v[i]] + w[i];
			dp[j] = Math.max(l, r);
			if(l > r) {
				f[j] = f[j];
			}else if (l < r) {
				f[j] = f[j-v[i]];
			}else{
				f[j] = f[j] + f[j-v[i]];
			}

同时要注意f数组的初始化,当考虑前0个物品时,方案是啥也不选,所以方案数是1,初始化代码如下,

for(int i = 0;i < k+1;i++){
	    f[i] = 1;
	}

完整代码如下,

import java.util.Scanner;
public class Main {
public static void main(String[] args) {
	Scanner scanner = new Scanner(System.in);
	int n = scanner.nextInt();
	int k = scanner.nextInt();
	int v[] = new int[n+1];
	int w[] = new int[n+1];
	int dp[] = new int[k+1];
	int f[] = new int[k+1];
	for (int i = 1; i < n+1; i++) {
		v[i] = scanner.nextInt();
		w[i] = scanner.nextInt();
	}
	for(int i = 0;i < k+1;i++) f[i] = 1;
	int mod = 1000000007;
	for (int i = 1; i < n+1; i++) {
		for (int j = k; j >= v[i]; j--) {
			int l = dp[j];
			int r = dp[j-v[i]] + w[i];
			dp[j] = Math.max(l, r);
			if(l > r) {
				f[j] = f[j];
			}else if (l < r) {
				f[j] = f[j-v[i]];
			}else{
				f[j] = f[j] + f[j-v[i]];
			}
			f[j] %= mod;
		}
	}
	System.out.println(f[k]);
}
}

背包问题求具体方案

在这里插入图片描述
正常求dp数组,求完后逆序推回去就行,对于dp[n][m],如果dp[n][m]=dp[n][m-v[i]]+w[i],那么第i个物品被选择,然后再接着往后求dp[n][m-v[i]]。
那么如何保证字典序最小?回顾一下求dp数组的过程,我们是优先考虑的字典序小的物品,但是最后求的时候我们是倒序推导,这样反而字典序大的物品会优先被输出,所以更改一下字典序小的物品放在后面求。
全部代码如下,

import java.util.Scanner;
public class Main {
public static void main(String[] args) {
	Scanner scanner = new Scanner(System.in);
	int n = scanner.nextInt();
	int V = scanner.nextInt();
	int[] v = new int[n+1];
	int[] w = new int[n+1];
	for (int i = 1; i < w.length; i++) {
		v[i] = scanner.nextInt();
		w[i] = scanner.nextInt();
	}
	int[][] dp = new int[n+2][V+1];
	for (int i = n; i > 0; i--) {
		for (int j = 0; j < V+1; j++) {
			dp[i][j] = dp[i+1][j];
			if(v[i] <= j) {
				dp[i][j] = Math.max(dp[i][j], dp[i+1][j-v[i]] + w[i]);
			}
		}
	}
	int vv = V;
	for (int i = 1; i < n+1&&vv>0; i++) {
		if(vv >= v[i] && dp[i][vv] == dp[i+1][vv-v[i]] + w[i]) {
			System.out.print(i + " ");
			vv -= v[i];
		}
	}
}
}

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

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

相关文章

CSP-202009-2-风险人群筛查

CSP-202009-2-风险人群筛查 解题思路 检查是否经过高危区 (x > x1) && (x < x2) && (y > y1) && (y < y2) 检查坐标是否在高危区域内&#xff0c; !isPassed 确保仅在第一次经过高危区域时增加 pass 计数。如果条件成立&#xff0c;表示…

Python3集合 set 心得

Python3集合 set 心得 本文是个人在学习中的一些心得&#xff0c;不能保证文中的内容准确&#xff0c;欢迎大家批评指正。 集合 set 是Python中的一种数据容器&#xff0c;集合有2种定义方式。 1、花括号 {} &#xff0c;花括号内加入集合的元素&#xff0c;元素之间用逗号 …

spark sql上线前的调试工作实现

背景 每个公司应该都有大数据的平台的吧&#xff0c;平台的作用就是可以在上面执行各种spark sql以及定时任务&#xff0c;不过一般来说&#xff0c;由于这些spark sql的上线不经过测试&#xff0c;所以可能会影响到生产的数据&#xff0c;这种情况下大数据平台提供一个上线前…

网络扫描神器:Nmap 保姆级教程(附链接)

一、介绍 Nmap&#xff08;Network Mapper&#xff09;是一款用于网络发现和安全审计的开源工具。它最初由 Gordon Lyon&#xff08;也被称为 Fyodor Vaskovich&#xff09;开发&#xff0c;是一款功能强大且广泛使用的网络扫描工具。Nmap 允许用户在网络上执行主机发现、端口…

【十四】【C++】list 的常见用法

list 的初始化和遍历 /*list的初始化和遍历*/ #if 1 #include <list> #include <vector> #include <iostream> #include<algorithm> using namespace std;void TestList1(){list<int> L1;list<int> L2(10, 5);vector<int> v{1,2,3,4…

奇异值分解(SVD)的应用——图像压缩

SVD方法是模型降阶的一类重要方法&#xff0c;本征正交分解&#xff08;POD&#xff09;和平衡截断&#xff08;BT&#xff09;都属于SVD类方法。 要想深入了解模型降阶技术&#xff0c;我们可以先从SVD的应用入手&#xff0c;做一个直观的了解。 1. SVD的定义和分类 我们想寻找…

01-Spring实现重试和降级机制

主要用于在模块调用中&#xff0c;出现失败、异常情况下&#xff0c;仍需要进行重复调用。并且在最终调用失败时&#xff0c;可以采用降级措施&#xff0c;返回一般结果。 1、重试机制 我们采用spring 提供的retry 插件&#xff0c;其原理采用aop机制&#xff0c;所以需要额外…

无人机应用场景和发展趋势,无人机技术的未来发展趋势分析

随着科技的不断发展&#xff0c;无人机技术也逐渐走进了人们的生活和工作中。无人机被广泛应用于很多领域&#xff0c;例如遥感、民用、军事等等。本文将围绕无人机技术的应用场景和发展趋势&#xff0c;从多角度展开分析。 无人机技术的应用场景 无人机在遥感方面的应用&…

2024 年,如何用 6 个月拿下 30 万年薪的区块链开发?

《区块链简易速速上手小册》开源系列专栏 文章目录 一、了解区块链二、简易速速上手小册系列&#xff08;开源版&#xff09;三、具体安排参考第1个月&#xff1a;基础加固第2个月&#xff1a;区块链原理与技术第3个月&#xff1a;深入智能合约开发第4个月&#xff1a;区块链平…

vtkActor 设置特定图层 显示及置顶显示

问题&#xff0c;有时我们需要显示某个 Actor 在相机最前面&#xff0c;可以遮盖后面的物体;显示在顶层有点不准确&#xff1b;因为这个还相机位置也有关系&#xff1b; 这里讲三种情况&#xff1a; 1. 设置 Mapper 顶层&#xff0c;尝试了一下&#xff0c;可以用于某些场景&…

C++ 模板初阶【函数模板,类模板】

文章目录 泛型编程函数模板概念函数模板的格式函数模板的原理函数模板的实例化隐式实例化:让编译器根据实参推演模板参数的实际类型显式实例化&#xff1a;在函数名后的<>中指定模板参数的实际类型 函数模板的匹配规则 类模板概念类模板格式类模板的实例化 泛型编程 在我…

【计算几何】确定两条连续线段向左转还是向右转

确定两条连续线段向左转还是向右转 目录 一、说明二、算法2.1 两点的叉积2.2 两个段的叉积 三、旋转方向判别3.1 左转3.2、右转3.3 共线判别 一、说明 如果是作图&#xff0c;或者是判别小车轨迹。为了直观地了解&#xff0c;从当前点到下一个点过程中&#xff0c;什么是左转、…

2-1 动手学深度学习v2-Softmax回归-笔记

回归 VS 分类 回归估计一个连续值分类预测一个离散类别 从回归到多类分类 回归 单连续数值输出输出的区间&#xff1a;自然区间 R \mathbb{R} R损失&#xff1a;跟真实值的区别 分类 通常多个输出&#xff08;这个输出的个数是等于类别的个数&#xff09;输出的第 i i i…

Redis核心技术与实战【学习笔记】 - 27.限制Redis Cluster规模的因素(通信开销)

简述 Redis Cluster 能保存的数据量以及支撑的吞吐量&#xff0c;跟集群实例规模相关。 Redis 官方给出了 Redis Cluster 的规模上线&#xff0c;就是一个集群运行 1000 个实例。 其实&#xff0c;限定 Redis Cluster 集群规模的一个关键因素就是&#xff0c;实例间的通信开销…

MySQL优化器

优化器 MySQL存储引擎中存在了一个可插拔的优化器OPTIMIZER_TRACE&#xff0c;可以看到内部查询计划的TRACE信息&#xff0c;从而可以知道MySQL内部执行过程 查询优化器状态 show variables like optimizer_trace;Variable_name Valueoptimizer_trace enabledoff,one_lineoff…

大模型实战营第二期——3. 基于 InternLM 和 LangChain 搭建你的知识库

github地址&#xff1a;InternLM/tutorial-书生浦语大模型实战营文档地址&#xff1a;基于 InternLM 和 LangChain 搭建你的知识库视频地址&#xff1a;基于 InternLM 和 LangChain 搭建你的知识库Intern Studio: https://studio.intern-ai.org.cn/console/instance动手学大模型…

如何在苹果Mac上进行分屏,多任务处理?

Apple 在 macOS Catalina 中引入了 Split View&#xff0c;让您可以同时查看两个应用程序。如果同时处理多个应用程序&#xff0c;但在它们之间切换时感到沮丧&#xff0c;小编教给大家在 Macbook Pro/Air 或 iMac 上使用分屏功能流畅地进行多任务处理。 注意&#xff1a;您可…

C# 委托(delegate)本质理解

目录 代码如下&#xff0c;很简单 运行的结果 反编译程序查看 关注两点&#xff1a; 什么是委托 委托的三个步骤 委托的意义 代码如下&#xff0c;很简单 namespace Delegate { class Program { delegate void SayHi(); void SayHi_1() …

专业135+总400+中国科学院大学859国科大信号与系统考研经验电子信息与通信,真题,大纲,参考书

今年考研专业课859信号与系统135&#xff0c;总分400上岸国科大&#xff0c;总结一下自己这一年的复习经验&#xff0c;希望对后面报考中科院大学的同学有所帮助。 专业课&#xff1a; 国科大不同研究所都是统一命题&#xff0c;859信号与系统的参考书目是郑君里的《信号与系…

移动光猫gs3101超级密码及改桥接模式教程

文章目录 超级管理员账号改桥接模式路由器连接光猫&#xff0c;PPPOE拨号即可&#xff01;附录&#xff1a;如果需要改桥接的话不知道拨号密码咋办打开光猫Telnet功能Telnet 登录 参考文章 移动光猫吉比特GS3101超级账号获取更改桥接 移动光猫gs3101超级密码及改桥接模式教程 …