2019 纪念品 · 方案一 逐天完全背包
今天买明天卖看成物品,每天做一次完全背包
正文
// CSP-J 2019 复赛 T3 · 纪念品
// 原题:https://oj.yecheng.tv/p/CSPJ2019C
// 题意:已知未来 T 天 N 种纪念品的价格,每天可买卖任意多次(当天卖的钱当天能再买),
// 最后一天必须全部卖出。问从 M 枚金币开始最多能变成多少。
//
// 方案一 · 逐天做一次完全背包(最贴近题意的写法)
// 关键转化一:「一直抱着不卖」和「今天卖掉、今天再用同样的价买回来」效果完全一样,
// 因为同一天的买价卖价是同一个数。于是每天只需要考虑「今天买、明天卖」。
// 关键转化二:第 i 天的第 j 种纪念品就是一个物品 —— 成本 P[i][j],明天能卖 P[i+1][j]。
// 同一种想买多少个都行(金币够就买),这正是完全背包。
// dp[c] 表示:这天开始手上有 c 枚金币,做完当天买卖后最多能剩下多少。
// 完全背包一定要正序枚举容量 c(01 背包才是倒序),这样才能重复买同一种。
#include <bits/stdc++.h>
using namespace std;
int p[105][105]; // p[i][j]:第 i 天第 j 种纪念品的价格
int main() {
freopen("souvenir.in", "r", stdin);
freopen("souvenir.out", "w", stdout);
int T, N;
long long money;
cin >> T >> N >> money;
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++) {
// 每天重新开始:什么都不买时,手上的钱就是自己
vector<long long> dp((size_t)money + 1);
for (long long c = 0; c <= money; c++) dp[(size_t)c] = c;
for (int j = 1; j <= N; j++) {
int cost = p[i][j];
int gain = p[i + 1][j];
for (long long c = cost; c <= money; c++) {
dp[(size_t)c] = max(dp[(size_t)c], dp[(size_t)(c - cost)] + gain);
}
}
money = dp[(size_t)money]; // 今天结束,钱变多了
}
cout << money << "\n";
return 0;
}
CSP-J 标程 · 复赛真题的其它内容
- 2019 数字游戏 · 方案一 逐字符统计
- 2019 数字游戏 · 方案二 二进制位运算
- 2020 优秀的拆分 · 方案一 贪心从大到小减
- 2020 优秀的拆分 · 方案二 直接看二进制位
- 2021 分糖果 · 方案一 枚举每个 k
- 2021 分糖果 · 方案二 看余数在哪一段
- 2022 乘方 · 方案一 边乘边判断
- 2022 乘方 · 方案二 快速幂加封顶
- 2023 小苹果 · 方案一 照规则真模拟
- 2023 小苹果 · 方案二 只盯住两个数字
- 2024 扑克牌 · 方案一 用集合去重
- 2024 扑克牌 · 方案二 二维布尔表
- 2025 拼数 · 方案一 收集后降序排序
- 2025 拼数 · 方案二 桶计数
- 2019 公交换乘 · 方案一 暴力匹配
- 2019 公交换乘 · 方案二 时间窗口优化
- 2020 直播获奖 · 方案一 每轮排序
- 2020 直播获奖 · 方案二 桶计数
- 2021 插入排序 · 方案一 每次真排一遍
- 2021 插入排序 · 方案二 增量维护有序表
- 2022 解密 · 方案一 二分求整数平方根
- 2022 解密 · 方案二 先估后校开方
- 2023 公路 · 方案一 朴素贪心
- 2023 公路 · 方案二 单调栈预处理
- 2024 地图探险 · 方案一 四方向分支写
- 2024 地图探险 · 方案二 方向数组
- 2025 座位 · 方案一 把座位表填出来
- 2025 座位 · 方案二 直接算排名
- 2019 纪念品 · 方案二 砍掉不赚钱物品
- 2020 表达式 · 方案一 每次重算后缀式
- 2020 表达式 · 方案二 建树加关键性传播
- 2021 网络连接 · 方案一 手写解析
- 2021 网络连接 · 方案二 读入后回拼校验
- 2022 逻辑表达式 · 方案一 递归分治
- 2022 逻辑表达式 · 方案二 递归下降
- 2023 一元二次方程 · 方案一 照公式逐步写
- 2023 一元二次方程 · 方案二 拆成小函数
- 2024 小木棍 · 方案一 先定位数再贪心
- 2024 小木棍 · 方案二 预处理最小数字表
- 2025 异或和 · 方案一 贪心能接就接
- 2025 异或和 · 方案二 动态规划加值域数组
- 2019 加工零件 · 方案一 递归加记忆化
- 2019 加工零件 · 方案二 奇偶最短路
- 2020 方格取数 · 方案一 深搜回溯
- 2020 方格取数 · 方案二 按列动态规划
- 2021 小熊的果篮 · 方案一 每轮扫一遍
- 2021 小熊的果篮 · 方案二 链表加有序集合
- 2022 上升点列 · 方案一 先只考虑不加点
- 2022 上升点列 · 方案二 二维动态规划
- 2023 旅游巴士 · 方案一 分层图加优先队列
- 2023 旅游巴士 · 方案二 状态压成一维
- 2024 接龙 · 方案一 按定义广搜
- 2024 接龙 · 方案二 滑动窗口逐轮推进
- 2025 多边形 · 方案一 枚举所有子集
- 2025 多边形 · 方案二 排序加计数 DP