专栏文章

题解:P13018 [GESP202506 七级] 调味平衡

P13018题解参与者 2已保存评论 1

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
1 条
当前快照
1 份
快照标识符
@mip04urp
此快照首次捕获于
2025/12/03 03:59
3 个月前
此快照最后确认于
2025/12/03 03:59
3 个月前
查看原文

题目传送门

思路

假设我们选取了 kk 个物品,选取的第 ii 个物品编号为 pip_i,并且它们是“平衡”的,那么显然的性质:i=1k(apibpi)=0\sum_{i=1}^k(a_{p_i}-b_{p_i})=0。那么我们就可以将 aibia_i-b_i 当做重量,ai+bia_i+b_i 当做价值,进行 01 背包。由于可能有负数下标,使用 map 维护 dp 数组即可,注意转移细节。时间复杂度 O(nVlognV)O(nV\log nV),其中 VV 是值域,可理解为 10510^5log\log 是 map 贡献的,可以通过此题。

Code

CPP
#include <bits/stdc++.h>
using namespace std;
#define il inline
#define pi pair<int, int>
#define mkp make_pair
const int N = 110, M = 5e4 + 10;
map<int, int> dp[N];
int v[N], w[N];
int main()
{
	int n, a, b;
	cin >> n;
	dp[0][0] = 0;
	for(int i = 1;i <= n;++i)
	{
		cin >> a >> b;
		v[i] = a + b;
		w[i] = a - b;
		for(auto j : dp[i - 1])
		{
			dp[i][j.first] = max(dp[i][j.first], j.second);
			dp[i][j.first + w[i]] = max(dp[i][j.first + w[i]], j.second + v[i]);
		}
	}
	cout << dp[n][0];
	return 0;
}

评论

1 条评论,欢迎与作者交流。

正在加载评论...