Luogu P3985 不开心的金明

Luogu P3985 不开心的金明

\(题目链接\)

Solution

简单来说就是01背包问题,但是物品最大数量为 \(100\), 物品重量和价值都 \(\leq 10^9\),但是保证极差(最大值减最小值) \(\leq 3\)

机房大佬给我说了这个题想了一下就胡出来做法了,但是一开始写挂了233333

先把所有的重量都减去它们的最小值,则剩下的重量一定都 \(\leq 3\)。剩下就比较简单了。

\(w[i]\) 表示第 \(i\) 个物品的重量(减去最小值), \(v[i]\) 表示第 \(i\) 个物品的质量, 计 \(minn\) 为原先重量的最小值。

\(f[i][j]\) 为选 \(i\) 个物品,重量为 \(j\) (已经减去重量的最小值)的最大价值。

对于选第 \(i\) 个物品对这个进行更新,有:

\[f[j][k]=\max{f[j-1][k-w[i]]+v[i]}\ \ \ (j*minn+k\leq m,w[i]\leq k \leq j*3) \]

因为为01背包,所以 \(j\)\(k\) 都是倒序循环。

感性理解一下,\(j\) 代表选择了几个物品,\(k\) 代表选择的 \(\sum w[l]\) 的值,此时此刻的答案。

\(j*minn+k\leq m\) 就是满足选出的物品在背包容量内,\(w[i]\leq k \leq j*3\) 这里的范围是 \(k\) 所有可能的取值,因为 \(\max\{\sum{w[l]}\}=j*3\) 就是 \(w\)全都是 \(3\) 的情况,\(\min\{\sum{w[l]}\}=w[i]\) 就是前面 \(w\) 全是 \(0\) 的情况。

#include<iostream>
#include<cstdio>
#include<algorithm>
#define ll long long
#define int long long
inline int Max(int x, int y) { return x > y ? x : y; }
inline int Min(int x, int y) { return x < y ? x : y; }
inline int read() {
	int r = 0; bool w = 0; char ch = getchar();
	while(ch < '0' || ch > '9') {
		if(ch == '-') w = 1;
		ch = getchar();
	}
	while(ch >= '0' && ch <= '9') {
		r = (r << 3) + (r << 1) + (ch ^ 48);
		ch = getchar();
	}
	return w ? ~r + 1 : r;
}
#undef int
const int N = 1100;
const int W = 3300;
const ll INF = 0x7fffffffffffffff;
int n, m;
ll w[N], v[N], minn = INF;
ll f[N][W], ans;
int main() {
	n = read(); m = read();
	for(int i = 1; i <= n; ++i) w[i] = read(), v[i] = read(), minn = Min(minn, w[i]);
	for(int i = 1; i <= n; ++i) w[i] -= minn;
	for(int i = 1; i <= n; ++i) {
		for(int j = n; j >= 1; --j)
			for(int k = j * 3; k >= w[i]; --k) {
				if(j * minn + k <= m) f[j][k] = Max(f[j][k], f[j - 1][k - w[i]] + v[i]);
				ans = Max(ans, f[j][k]);
			}
	}
	printf("%lld\n", ans);
	return 0;
}
posted @   do_while_true  阅读(129)  评论(0编辑  收藏  举报
编辑推荐:
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
阅读排行:
· Windows桌面应用自动更新解决方案SharpUpdater5发布
· 我的家庭实验室服务器集群硬件清单
· C# 13 中的新增功能实操
· Supergateway:MCP服务器的远程调试与集成工具
· Vue3封装支持Base64导出的电子签名组件

This blog has running: 1862 days 2 hours 6 minutes 20 seconds

点击右上角即可分享
微信分享提示