CCF-202209-2-何以包邮?01背包

news2025/1/13 13:14:36

目录

1、题目描述:

2、思路1:动态规划

2.1、确定dp数组及下标含义

2.2、递推公式

2.3、初始化dp数组

2.4、确定遍历顺序

2.5、C++实现如下

3、思路2:暴力法-空间换时间


1、题目描述:

新学期伊始,适逢顿顿书城有购书满  x 元包邮的活动,小 P 同学欣然前往准备买些参考书。
一番浏览后,小 P 初步筛选出 n 本书加入购物车中,其中第 i 本(1≤ i ≤ n)的价格为 a[i] 元。
考虑到预算有限,在最终付款前小 P 决定再从购物车中删去几本书(也可以不删),使得剩余图书的价格总和 sum 在满足包邮条件(sum ≥ x)的前提下最小。

试帮助小 P 计算,最终选购哪些书可以在凑够 x 元包邮的前提下花费最小?

输入格式:

从标准输入读入数据。

输入的第一行包含空格分隔的两个正整数 n 和 x ,分别表示购物车中图书数量和包邮条件。

接下来输入 n 行,其中第 i 行(1≤ i ≤ n)仅包含一个正整数 a[i],表示购物车中第 i 本书的价格。输入数据保证 n 本书的价格总和不小于 x 。

输出格式:

输出到标准输出。

仅输出一个正整数,表示在满足包邮条件下的最小花费。

示例:

样例1输入

4 100
20
90
60
60

样例1输出

110

样例1解释

购买前两本书(20+90)即可包邮且花费最小。

样例2输入

3 30
15
40
30

样例2输出

30

样例2解释

仅购买第三本书恰好可以满足包邮条件。

样例3输入

2 90
50
50

样例3输出

100

样例3解释

必须全部购买才能包邮。

2、思路1:动态规划

阅读题目可以发现,题目要求选择满足包邮条件下的最小花费,听起来很像01背包相关的问题,与常规的01背包问题不同的是,背包的大小似乎是变化的,以往做的题目都是确定 一个条件选择满足的最大值,但该题目要求选择的是满足条件下的最小的值,所以第一次做这个题目的时候只得了95分,最后还是超时了五分,因为我将背包大小设置为x,先判断背包大小为x时能否装满价值等于x的书,如果不行就逐个增加背包的大小再重新判断,所以需要执行很多次循环,也就超时了。

题目比较巧妙的地方是,他将条件进行了转换,如果我们反着思考,背包的大小为sum-x,当背包大小为sum-x时能装的最大价值为ex,而ex这个数值一定是小于等于x的,因为此题目中,书籍的质量与价值相等,所以sum-ex即为满足包邮条件的最小花费,理清了思路代码实现非常简单,即经典的01背包问题。

2.1、确定dp数组及下标含义

dp[i]表示大小为i的背包能放最大价值为dp[i]的书

2.2、递推公式

dp[j] = max(dp[j],dp[j-a[i]]+a[i]);

2.3、初始化dp数组

dp[0]表示背包大小为0时能放下多少书,根据题目描述,dp[0]自然是0,而其他的dp数组初始化为最小非负数即可。

2.4、确定遍历顺序

外层遍历物品从前往后,内层遍历背包从大到小

2.5、C++实现如下

#include<iostream>
#include<algorithm>
using namespace std;

int main() {
	int n,x;
	cin>>n>>x;
	int a[n];
	int sum = 0;
	for(int i = 0; i<n; ++i) {
		cin>>a[i];
		sum+=a[i];
	}

	int target = sum-x;
	vector<int> dp(target+1,0);
	for(int i = 0; i<n; ++i) {
		for(int j = target; j>=a[i]; --j) {
			dp[j] = max(dp[j],dp[j-a[i]]+a[i]);
		}
	}
	cout << sum-dp[target];
	return 0;
}

3、思路2:暴力法-空间换时间

遍历每一本书,每次选择买与不买,将每本书买与不买的花费存到set容器中,那么最后一个set容器中将保存每一种情况的花费,而set内部又是存在排序的,这样时间复杂度优化为O(n)。

考试的时候写不下去可以往空间换时间的角度来思考。

#include<iostream>
#include<set>
using namespace std;

int main() {
	int n,x;
	cin>>n>>x;
	int a[n+1];
	int sum = 0;
	for(int i = 1; i<=n; ++i) {
		cin>>a[i];
		sum+=a[i];
	}
	set<int> s[n+1];
	s[0].insert(0);
	for(int i = 1;i<=n;++i){
		set<int>::iterator it = s[i-1].begin();
		for(it;it!=s[i-1].end();++it){
			int buy = *it+a[i];
			int noBuy = *it;
			s[i].insert(buy);
			s[i].insert(noBuy);
		}
	}
	set<int>::iterator it = s[n].begin();
	for(it;it!=s[n].end();++it){
		if(*it>=x){
			cout << *it << endl;
			break;
		}
	}
	return 0;
}

根据运行结果我们也可以看出该题使用了空间换时间的策略,但也是可以得到100分的。

 

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

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

相关文章

OpenGL(八)——图像逆透视算法IPM

目录 一、前言 二、相机模型 2.1 针孔模型 2.2 相机外参 三、逆透视模型 四、算法总结 一、前言 透视变换&#xff08;Perspective Transformation)是指利用透视中心、像点、目标点三点共线的条件&#xff0c;按透视旋转定律使承影面&#xff08;透视面&#xff09;绕迹线…

Cesium 实战-解决 The browser supports WebGL, but initialization failed 问题

Cesium 实战-解决 The browser supports WebGL, but initialization failed 问题 系统环境版本试错过程解决问题 在公司内网服务器部署 Cesium 项目的时候&#xff0c;发现提示浏览器不支持 WebGL 错误&#xff0c;经尝试&#xff0c;确认 Cesium 1.101.0 以及之前的版本是可以…

职场小白如何快速成为房地产策划专家?全覆盖解密

如果你是刚入行的地产策划新手小白&#xff1a; 1、首先要会房地产的基础知识&#xff0c;相关的政策法规等&#xff0c;因为这些都是制定策略的最基本的依据&#xff0c;如果这些你都不熟&#xff0c;制定出来的策划就会有错误。建议你多买几本地产基础知识的书看看。 2、把…

14.网络编程基础

1.网络编程入门 1.1 网络编程概述【理解】 计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路连接起来&#xff0c;在网络操作系统&#xff0c;网络管理软件及网络通信协议的管理和协调下&#xff0c;实现资源共享和信息传递的计…

Axios概述

一、Json-server 获得零编码的完整伪造 REST API zero coding 在不到 30 秒的时间内 &#xff08;认真&#xff09;。 使用 <3 创建&#xff0c;适用于需要快速后端进行原型设计和模拟的前端开发人员&#xff0c;模拟后端发送过来json数据。 1.安装 npm install -g jso…

OPNET Modeler 例程——停等协议的建模和仿真

文章目录 一、概述二、链路模型和包格式创建三、进程模型1.src 进程模型2.sink 进程模型 四、节点模型五、网络模型六、仿真结果 一、概述 本例程是在 OPNET Modeler 中对停等协议的建模和仿真&#xff0c;其中停等协议的操作过程如下&#xff1a; &#xff08;1&#xff09;发…

【Spring Cloud Alibaba】Nacos config的使用和高阶用法

文章目录 &#x1f40d;第一步&#xff0c;创建配置文件到nacos中&#x1f40d;第二步&#xff0c;在项目中配置nacos的地址和指定文件&#x1f40d;第三步&#xff0c;读取配置文件&#x1f426;高阶用法&#x1f426;高阶用法一&#xff1a;使用yaml文件&#x1f426;第一步&…

5年功能测试,薪资定格8K迷茫了....我该如何破局?

前言 来自一位粉丝的投稿&#xff0c;从毕业开始就一直在从事软件测试的工作&#xff0c;到目前已经是第5个年头了&#xff0c;从4k涨到了8K&#xff0c;显而易见我们这位粉丝并不满足现状&#xff0c;于是问我怎么破局&#xff0c;他当下应该干什么事情,或者应该学习什么技术…

从零开始学习Linux运维,成为IT领域翘楚(十)

文章目录 &#x1f525;Linux网络防火墙&#x1f525;Linux内核机制 &#x1f525;Linux网络防火墙 防火墙管理工具 firewalld概述 Centos 系统中集成了多款防火墙管理工具&#xff0c;其中 firewalld服务是默认的防火墙配置管理工具&#xff0c;它拥有基于 CLI&#xff08;…

Aha! Adaptive History-driven Attack for Decision-based Black-box Models

AHA!基于决策的黑盒模型的自适应历史驱动攻击 Aha! Adaptive History-driven Attack for Decision-based Black-box Models ABSTRACT 基于决策的黑盒攻击指的是只使用受害者模型的前1个标签来制作对抗示例。一种常见的做法是从一个大的扰动开始&#xff0c;然后用一个确定的方…

【Nacos源码分析】

Nacos源码分析 Nacos源码分析1.下载Nacos源码并运行1.1.下载Nacos源码1.2.导入Demo工程1.3.导入Nacos源码1.4.proto编译1.4.1.什么是protobuf1.4.2.安装protoc1.4.3.编译proto 1.5.运行 2.服务注册2.1.服务注册接口2.2.客户端2.2.1.NacosServiceRegistryAutoConfiguration2.2.2…

【软件测试】| 软件测试 - 答疑篇

&#x1f397;️ 主页&#xff1a;小夜时雨 &#x1f397;️ 专栏&#xff1a;软件测试 &#x1f397;️ 如何优雅的活着&#xff0c;是我找寻的方向 目录 一、什么是软件测试二、测试和调试的区别三、软件测试和开发的区别 一、什么是软件测试 最常见的理解是&#xff1a;软…

使用J-Link的J-Scope功能查看数据实时波形

使用串口打印波形的不便之处 对于要查看的实时变量&#xff0c;一般可以用串口打印到可以查看波形的上位机上。但是这种办法有几个不方便的地方&#xff1a; 需要根据配套上位机的通讯协议&#xff0c;在单片机上编写上传数据的代码 单片机CPU需要浪费部分时间在串口数据上传上…

Makefile基础教程(变量的介绍和使用)

文章目录 前言一、Makefile变量概念介绍二、Makefile中变量的赋值方式1.简单赋值2.递归赋值3.条件赋值4.追加赋值 三、Makefile赋值在工程中的应用总结 前言 在C语言等语言中存在变量这个概念那么在Makefile中也是存在变量这个概念的&#xff0c;现在就让我们来学习一下什么是…

Solr(5):Solr控制台说明-主面板

1 Dashboard(仪表盘) 访问 http://ip:8983/solr时&#xff0c;出现该主页面&#xff0c;可查看到solr运行时间、solr版本&#xff0c;系统内存、虚拟机内存的使用情况 这里的图片描述 2 Logging(日志) 显示solr运行出现的异常或错误 3 Core Admin (core管理) 主要有Add Cor…

Java--io流知识总结

什么是输入/输出流 Java 程序通过流来完成输入/输出&#xff0c;所有的输入/输出以流的形式处理。因此要了解 I/O 系统&#xff0c;首先要理解输入/输出流的概念。 输入就是将数据从各种输入设备&#xff08;包括文件、键盘等&#xff09;中读取到内存中&#xff0c;输出则正好…

抢先微软,Google版Copilot上线!谷歌宣布给Google全家桶开放Bard功能

夕小瑶科技说 原创作者 | 智商掉了一地、兔子酱 就在本月 5 号&#xff0c;Bard 和 Google Workspace 同步更新了一则新闻&#xff0c;宣布 Workspace 的团队用户即日起可以申请体验由 Bard 大模型驱动的生成式 AI 工具。 这项计划在今年 3 月份首次公布&#xff0c;当时该工具…

上架Google play 提示 不符合64位版本应用的要求

此版本不符合 Google Play 关于提供 64 位版本应用的要求以下 APK 或 App Bundle 面向 64 位设备&#xff0c;但只有 32 位原生代码:[29]请向应用中添加64位和 32 位原生代码。使用 Android App Bundle 发布格式可自动确保每种设备架构仅收到所需加应用的总大小。 在build.gra…

HCIA-RS实验-路由配置-RIPv2 路由汇总和认证

RIPv2 路由汇总和认证简介&#xff1a; RIPv2 是一个距离向量路由协议&#xff0c;用于在网络中选择最佳路径。RIPv2 路由汇总和认证是两个重要的功能&#xff0c;可以提高路由协议的可靠性和安全性。 1. 路由汇总 路由汇总是将多个路由表项合并成一个较小的路由表项的过程。在…

vscode IDE 能用的上的扩展工具功能介绍

记录分享vscode扩展&#xff0c;包括提升开发效率。必备。主题美化。ChatGPT等。 参考 vscode-extensions [Best] 记录分享方式&#xff0c;整理自己用的扩展&#xff0c;还有一键备份和还原方法。 ⭐快速下载和使用扩展 后面会介绍很多vscode扩展.这裡有一个技巧&#xff0c;…