CSP-J 2019纪念品题解(洛谷P5662):动态规划+完全背包问题的实战应用

贾蔷
• 阅读 13

CSP-J 2019纪念品题解(洛谷P5662):动态规划+完全背包问题的实战应用

一、题目解读

2019年CSP-J的“纪念品”问题(对应洛谷P5662)要求玩家在T天内通过买卖纪念品最大化金币收益。每天可交易N种商品,需计算最优策略下的最终金币数。题目强调动态规划思维与资源分配优化,是算法竞赛中的经典题型。

二、解题思路

核心思路为“动态规划+完全背包问题”。每天将当前商品价格与次日差价视为“物品价值”,通过滚动计算次日可获得的“最大收益背包”,动态更新总金币数。关键在于将“连续两天的差价利润”转化为可重复选择的“背包物品”,利用dp[i](i金币时的最大收益)实现状态转移

三、解题步骤

  1. 输入处理:读取天数T、商品数N、初始金币M及每日价格矩阵

  2. 外层循环遍历T-1天(最后一天无法交易)。

  3. 内层循环处理当日商品:计算差价profit,仅对正利润商品执行完全背包更新(避免无利操作)。

  4. 状态转移方程:dp[j]=max(dp[j],dp[j-cost]+profit),实现“用剩余金币重复购买差价商品”的逻辑。

  5. 每日结束后,将dp[M]累加到总金币M,滚动优化。

四、代码与注释

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr); // 优化输入效率

    int T, N, M;
    cin >> T >> N >> M; // 输入天数、商品数、初始金币

    vector<vector<int>> prices(T, vector<int>(N)); // 价格矩阵
    for (int i = 0; i < T; ++i) {
        for (int j = 0; j < N; ++j) {
            cin >> prices[i][j];
        }
    }

    // 每天处理时,计算当天到第二天的最大收益
    for (int day = 0; day < T - 1; ++day) {
        vector<int> dp(M + 1, 0); // dp[i]表示i金币能获得的最大收益

        for (int item = 0; item < N; ++item) {
            int cost = prices[day][item];
            int profit = prices[day + 1][item] - cost; // 次日差价

            if (profit <= 0) continue; // 无利可图则跳过

            // 完全背包问题解法
            for (int j = cost; j <= M; ++j) { // 从成本开始累加
                dp[j] = max(dp[j], dp[j - cost] + profit); // 状态转移
            }
        }

        // 更新最大金币数
        M += dp[M];
    }

    cout << M << endl; // 输出最终金币
    return 0;
}

五、总结

该解法巧妙将“连续两天的利润”抽象为可重复选择的“背包物品”,通过动态规划规避了复杂的路径搜索。关键在于识别问题中的“资源可重复利用”特性,并应用完全背包模型简化计算。对算法竞赛中的资源分配类问题具有重要参考价值。

来源:CSP题解

点赞
收藏
评论区
推荐文章
贾蔷 贾蔷
1个月前
力扣1137题 解题思路和步骤 C++代码实现,力扣一共多少题
一、题目分析力扣1137题要求我们找到第N个泰波那契数。泰波那契数的定义是:T00,T11,T21,且在n0的条件下Tn3TnTn1Tn2。,当n4时,T4T3T2T14。这道题主要考查我们对递归或动态规划的理解和运用。在思考解题方法时,我们
贾蔷 贾蔷
2星期前
牛客12576题全解析:动态规划+质因数分解解决跳跃问题
一、题目解读牛客12576题是一道经典的算法题,要求给定起点N和终点M,求解从N到M的最少跳跃次数。题目考察的核心在于路径优化与动态规划思想,需结合数论中的质因数分解技巧,通过合理设计算法降低时间复杂度,避免暴力枚举的指数级耗时。二、解题思路采用“动态规划
贾蔷 贾蔷
2星期前
CSP-J 2019公交换乘题解析:基于队列优化的动态规划代码详解
一、题目解读CSPJ2019年的“公交换乘”题目(洛谷P5661)要求模拟地铁与公交交替出行的费用计算。题目核心在于地铁消费会产生优惠券,而公交可在45分钟内使用优惠券抵扣车费。需要处理n条出行记录,优化总费用。该问题考察对时间窗口与动态资源管理的理解,需
深度学习 深度学习
2星期前
2024蓝桥杯省赛B组前缀总分(洛谷P12124)解题思路与代码详解
一、题目解读2024年蓝桥杯省B组题目“前缀总分”(对应洛谷P12124)要求计算给定字符串集合中,所有前缀的最长公共前缀(LCP)的总分,并找出通过移动字符位置后可能获得的最大总分。题目考察字符串处理与动态规划能力,需高效计算LCP并优化得分策略。二、解
贾蔷 贾蔷
2星期前
2023年GESP六级题解:洛谷P10108闯关游戏动态规划解法详解
一、题目解读本文针对2023年GESP六级题目“闯关游戏”(洛谷P10108)进行详细解析。题目要求玩家通过不同关卡路径选择,计算从起点到终点的最大得分。关卡间存在跳跃规则,需结合动态规划思想设计高效算法,最终输出最优得分。二、解题思路采用动态规划(Dyn
深度学习 深度学习
2星期前
洛谷P2034题解:动态规划+单调队列优化求解最大K段子段和问题
一、题目解读洛谷P2034题目要求给定一个长度为n的整数数组,将其分成不超过k段,求各段和的最大值。该问题属于经典动态规划问题的扩展,需结合优化技巧高效求解。二、解题思路采用动态规划单调队列优化的策略。核心思想是定义状态dp
深度学习 深度学习
2星期前
动态规划进阶:牛客4802题带附件背包问题详解 | 组合优化技巧
一、问题背景与算法思路牛客4802题是一个典型的带附件的背包问题变种,要求在主件和附件存在依赖关系的情况下,选择物品组合使总价值最大化。本文通过动态规划方法,将问题转化为分组背包问题,通过预处理所有可能的组合方式来实现高效求解。二、完整代码实现(带详细注释
深度学习 深度学习
2星期前
2012年NOIP提高组「借教室」(洛谷P1083)解题思路与二分查找优化代码解析
一、题目解读本题为2012年NOIP提高组中的「借教室」问题(洛谷P1083),要求处理教室借用订单的分配问题。给定n天每天可用教室数量r和m个订单(订单包含需求教室数d、开始日期s、结束日期t),判断能否通过删除部分订单使所有订单满足教室容量限制。若能,
深度学习 深度学习
5天前
NOIP 2008火柴棒等式题解(C++代码实现) 动态规划与枚举算法详解
一、题目解读问题(,)要求使用给定数量的火柴棒,构造形如ABC的等式,其中A、B、C均为整数,且火柴棒总数恰好等于输入值。需统计符合条件的等式数量。题目核心在于将数字拆解与火柴棒消耗建模为数学问题,寻找高效解法。二、解题思路采用火柴棒计数策略:1.关系
贾蔷 贾蔷
3天前
洛谷1220题解:动态规划与区间DP优化解法
一、题目解读1220题要求计算在n个位置放置灯的情况下,通过关闭连续区间灯并移动至区间端点,使得总耗电量最小。需考虑灯的功率与位置差异,设计高效的求解最优策略。二、解题思路1.:定义状态dp:使用sum存储灯功率前缀和,简化区间电量计算。3.核心:○向左