目录
一、题目
1、题目描述
2、输入输出
2.1输入
2.2输出
3、原题链接
二、解题报告
1、思路分析
2、复杂度
3、代码详解
一、题目
1、题目描述
2、输入输出
2.1输入
2.2输出
3、原题链接
1974E - Money Buys Happiness
二、解题报告
1、思路分析
问我们能够到达的最大幸福度
每个商品选或不选,我们的钱有限,这就相当于一个以幸福度为容量,钱为价值的01背包
定义状态f(i, j)为 前 i 个物品,获得 j 幸福度,剩下的最多的钱
那么 f(i, j) = max(f(i - 1, j - h) - c)
根据题意,我们每月结束,都要对当前合法的 f(i, j) 加上 x
2、复杂度
时间复杂度: O(MH)空间复杂度:O(MH)
3、代码详解
#include <bits/stdc++.h>
// #define DEBUG
using u32 = unsigned;
using i64 = long long;
using u64 = unsigned long long;
constexpr int inf32 = 1E9 + 7;
constexpr i64 inf64 = 1E18 + 7;
void solve() {
int m, x;
std::cin >> m >> x;
int s = 0;
std::vector<i64> f{-1};
for (auto &v : f)
v = -1;
f[0] = 0;
for (int i = 0; i < m; ++ i) {
int c, h;
std::cin >> c >> h;
s += h;
f.resize(s + 1, -1);
for (int j = s; j >= h; -- j) {
if (f[j - h] >= c) {
f[j] = std::max(f[j], f[j - h] - c);
}
}
for (int j = 0; j <= s; ++ j)
if (f[j] >= 0)
f[j] += x;
}
int res = 0;
for (int i = 0; i <= s; ++ i)
if (f[i] >= 0) {
res = i;
}
std::cout << res << '\n';
}
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
#ifdef DEBUG
int cur = clock();
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif
int t = 1;
std::cin >> t;
while (t--) {
solve();
}
#ifdef DEBUG
std::cerr << "run-time: " << clock() - cur << '\n';
#endif
return 0;
}