背包问题(一)

news/2024/7/8 2:40:00 标签: 算法

一.P3985 不开心的金明(01背包变式)

 

 

解析:

 一开始没有看数据范围,直接当01背包直接写了,结果最后4个测试点RE,一看到数据范围就老实了,1e9的数据,数组直接炸,所以不能直接使用一维的01背包.看了一下题解,部分人是通过极差对数据进行分类,按照300进行分开,使用贪心和dp一起做.

我认为有些麻烦了,我们之所以不能通过一维01背包来实现就是因为数据范围太大,但如果我们可以将数据范围减少,那我们依然可以通过01背包实现.因为极差最大为3,我们只要将所有数据都减去其中的最小值,那么物品的价格的范围就被缩到0~3了,为了方便使用,我们可以都加上1,让范围从一开始,从而最后总的价格也就被控制在1000以内.但由于,我们是把所有物品的价格都减去最小值,那我们在尝试放入背包时就要再在加上判断,以此我们要在加上一维,再在dp数组中多加一维,记录一共选了几个.dp[i][j]表示我选的修改后的物品的选了i个,价格为j.

代码实现:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define N 1000005
ll dp[1005][1005], w[N], v[N];
ll a, b, c, n, m, t;
ll ans, sum, num, minn=1e9+7, maxx;
int main()
{
	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		cin >> w[i] >> v[i];
		minn = min(minn, w[i]);
	}
	minn--;
	sum = 0;
	for (int i = 1; i <= n; i++) {
		w[i] -= minn;
		sum += w[i];
	}
	for (int i = 1; i <= n; i++) {
		for (int j = sum; j >= w[i]; j--) {
			for (int k = n; k >= 1; k--) {
				if (k * minn + j <= m)
					dp[k][j] = max(dp[k][j], dp[k-1][j - w[i]] + v[i]);
			}
		}
	}
	ans = 0;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= sum; j++) {
			ans = max(ans, dp[i][j]);
		}
	}
	cout << ans << endl;
}

 

二.P5662 [CSP-J2019] 纪念品(完全背包变形)

 

 

解析:

这道题的关键在于如何将抽象的问题转换成我们熟悉的模型:

这是一道完全背包的题,我们进行 𝑡−1 轮完全背包:

把今天手里的钱当做背包的容量

把商品今天的价格当成它的消耗,

把商品明天的价格当做它的价值

每一天结束后把总钱数加上今天赚的钱,直接写背包模板即可。

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define N 1000005
ll dp[N], w[N], v[N], p[105][105];
ll a, b, c, n, m, t;
ll ans, sum, num, minn = 1e9 + 7, maxx;
int main()
{
	cin >> t >> n >> m;
	for (int i = 1; i <= t; i++) {
		for (int j = 1; j <= n; j++) {
			cin >> p[i][j];
		}
	}
	for (int i = 1; i < t; i++) {
		memset(dp, 0, sizeof(dp));
		for (int j = 1; j <= n; j++) {
			for (int k = p[i][j]; k <= m; k++) {
				dp[k] = max(dp[k], dp[k - p[i][j]] + p[i + 1][j] - p[i][j]);
			}
		}
		m += dp[m];
	}
	cout << m << endl;
	return 0;
}

P5020 [NOIP2018 提高组] 货币系统(完全背包变形)

解析:

将a数组从小到大排序,最小的数必须要选,然后利用完全背包的思想,从𝑎𝑖ai​到最大值筛选一遍,将可以组成的打上标记,在判断后面的数字时,如果已经被标记过了,就不再选,没有被标记过就标记一下,再筛选一次数(即一次完全背包)

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define N 1000005
ll dp[N], w[N], v[N], vis[N];
ll a, b, c, n, m, t;
ll ans, sum, num, minn = 1e9 + 7, maxx = 0;
int main()
{
	cin >> t;
	while (t--)
	{
		cin >> n;
		for (int i = 1; i <= n; i++) {
			cin >> w[i];
			maxx = max(maxx, w[i]);
		}
		memset(vis, 0, sizeof(vis));
		sort(w + 1, w + 1 + n);
		ans = 0;
		for (int i = 1; i <= n; i++) {
			if (vis[w[i]])
				continue;
			ans++;
			vis[w[i]] = 1;
			for (int j = w[i]; j <= maxx; j++) {
				vis[j] = max(vis[j], vis[j - w[i]]);
			}
		}
		cout << ans << endl;
	}
	return 0;
}


http://www.niftyadmin.cn/n/5536051.html

相关文章

IPython的“%paste“魔法:代码粘贴的救星

IPython的"%paste"魔法&#xff1a;代码粘贴的救星 在数据科学和编程的世界中&#xff0c;效率和便捷性是至关重要的。IPython&#xff0c;作为一个强大的交互式Python解释器&#xff0c;提供了一系列的"魔法命令"来增强用户体验。其中&#xff0c;%paste…

深入浅出:npm常用命令详解和实践

npm 是 Node.js 的包管理器&#xff0c;用于管理 Node.js 应用的依赖关系和版本。 以下是一些常用的 npm 命令&#xff1a; npm init: 命令用于初始化一个新的 Node.js 项目。它会创建一个 package.json 文件&#xff0c;这个文件包含了项目的元数据和依赖信息。 npm initnpm…

【C++ | 继承】|概念、方式、特性、作用域、6类默认函数

继承 1.继承的概念与定义2.继承的方式2.1继承基本特性2.2继承的作用域2.2.1隐藏赋值兼容 派生类的创建和销毁构造函数拷贝构造赋值重载 1.继承的概念与定义 继承是面向对象编程中的一个重要概念。它的由来可以追溯到软件开发中的模块化设计和代码复用的需求。 在软件开发过程…

牛客C++刷题记录

C 运算符优先级 运算符优先级顺口溜&#xff1a;淡云一笔&#xff0c;鞍落三服。 淡&#xff1a;单目运算符&#xff1b; 云&#xff1a;算数运算符&#xff1b; 一&#xff1a;移位运算符&#xff1b; 笔&#xff1a;比较运算符&#xff1b; 鞍&#xff1a;按位运算符&a…

419. 甲板上的战舰

419. 甲板上的战舰 题目链接&#xff1a;419. 甲板上的战舰 代码如下&#xff1a; class Solution { public:int countBattleships(vector<vector<char>>& board) {int res0;int rowboard.size(),colboard[0].size();for(int i0;i<row;i){for(int j0;j&l…

零基础STM32单片机编程入门(五)FreeRTOS实时操作系统详解及实战含源码视频

文章目录 一.概要二.什么是实时操作系统三.FreeRTOS的特性四.FreeRTOS的任务详解1.任务函数定义2.任务的创建3.任务的调度原理 五.CubeMX配置一个FreeRTOS例程1.硬件准备2.创建工程3.调试FreeRTOS任务调度 六.CubeMX工程源代码下载七.讲解视频链接地址八.小结 一.概要 FreeRTO…

Java中的服务化架构设计与实现

Java中的服务化架构设计与实现 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 1. 引言 随着软件系统规模的不断扩大和业务需求的增加&#xff0c;传统的单体…

AI绘画Stable Diffusion 【ControlNet妙用】:用brightness 模型制作炫彩灯影秀

大家好&#xff0c;我是设计师阿威 今天给大家分享一下如何在图片中生成有光影效果的文字 在ControlNet中&#xff0c;利用PS制作艺术字&#xff08;也可以网页在线生成艺术字&#xff09;& brightness获取需要的灯影效果图。 1.下载安装、安装需要的模型brightness 模…