当前位置:首页 > 题解目录 > 正文内容

【题解】公交乘车

亿万年的星光1年前 (2025-02-08)题解目录1038

【题目描述】

A城市有一条非常特别的街道,该街道在每个公里的节点上都有一个公交车站,乘客可以在任意的公交站点上车,在任意的公交站点下车。乘客根据每次乘坐公交的公里数进行付费,比如,下表就是乘客乘坐不同的公里数要付的费用。(请注意:不一定公里数越高,费用越高,这也是这条街道特别的地方)

一辆公交车单次行驶的公里数一定不超过10公里,一个乘客如果打算乘坐公交车完成n公里(1<=n<=100)的行程,他可以选择无限次的换车来完成行程。

请问,他最少要花多少钱?

【输入描述】

 第一行十个整数分别表示公交行走1到10公里的费用(<=500)。注意这些数并无实际的经济意义,即行驶10公里费用可能比行驶一公里少。

第二行一个整数n表示,旅客的总路程数。 (1<=n<=100)

【输出描述】

仅一个整数表示最少费用。

【样例输入】

12 21 31 40 49 58 69 79 90 101
15

【样例输出】

147


【题目分析】

我们需要计算行驶 n 公里的最小费用。公交公司提供的费用表如下:

  • 行驶 1 公里的费用为 cost[0]

  • 行驶 2 公里的费用为 cost[1]

  • ...

  • 行驶 10 公里的费用为 cost[9]

目标是找到行驶 n 公里的最小费用。


动态规划的第一步是定义状态。状态需要能够描述问题的子问题,并且可以通过状态转移逐步求解原问题。

对于本问题:

  • 设 dp[i] 表示行驶 i 公里的最小费用。

  • 我们的目标是求 dp[n]


为了求解 dp[i],我们需要考虑如何通过更小的子问题来构造它。具体来说:

  • 行驶 i 公里的费用可以通过以下方式得到:

    • 先行驶 j 公里,费用为 cost[j - 1]

    • 然后行驶剩下的 i - j 公里,费用为 dp[i - j]

  • 因此,行驶 i 公里的总费用为 dp[i - j] + cost[j - 1]

为了找到行驶 i 公里的最小费用,我们需要尝试所有可能的 j(从 1 到 10),并选择其中的最小值。因此,状态转移方程为:

  dp[i] = min(dp[i], dp[i - j] + cost[j - 1]);

解释

  • dp[i]:当前行驶 i 公里的最小费用。

  • dp[i - j]:行驶 i - j 公里的最小费用。

  • cost[j - 1]:行驶 j 公里的费用。

  • min(dp[i], dp[i - j] + cost[j - 1]):选择所有可能的 j 中的最小值。


【参考答案】

#include<bits/stdc++.h> 
using namespace std;
int main() {
    int cost[10];  // 输入1到10公里的费用
    int dp[105];  // 初始化dp数组
    for (int i = 0; i < 10; i++) {
        cin >> cost[i];
    }
    // 输入总路程
    int n;
    cin >> n;
    for (int i = 0; i <= n; i++) {
        dp[i] = INT_MAX; // 初始化为不可达
    }
    dp[0] = 0; // 行驶0公里的费用为0

    // 动态规划求解
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= 10; j++) {
            if (i >= j && dp[i - j] != INT_MAX) {
                dp[i] = min(dp[i], dp[i - j] + cost[j - 1]);
            }
        }
    }

    // 输出结果
    cout << dp[n] << endl;

    return 0;
}


    扫描二维码推送至手机访问。

    版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

    分享给朋友:

    相关文章

    剪刀石头布

    【题目描述】石头剪子布,是一种猜拳游戏。起源于中国,然后传到日本、朝鲜等地,随着亚欧贸易的不断发展它传到了欧洲,到了近现代逐渐风靡世界。简单明了的规则,使得石头剪子布没有任何规则漏洞可钻,单次玩法比拼...

    【题解】翻手算法

    翻手算法(fanshou.cpp) 【问题描述】 ⼩酷爱算法,他在编程珠玑⼀书中了解到了⼀种新的算法——翻⼿算法,为了更好的理解算 法,⼩明找来⼀叠纸牌,每⼀张纸牌上只有⼀个⼤写或...

    【题解】剔除相关数

    【题目描述】一个数与另一个数如果含有相同数字和个数的字符,则称两数相关。现有一堆乱七八糟的整数,里面可能充满了彼此相关的数,请你用一下手段,自动地将其剔除。【输入描述】每组数据前有一个N(<10...

    【题解—深搜】马走日

    【题解—深搜】马走日

    【题目描述】马在中国象棋以日字形规则移动。请编写一段程序,给定n×m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点。【输入】第一行为整...

    【题解】自动晾衣机

    【题目描述】有一个环形可以晾衣服的衣架,有若干个夹子组成,它可以晾不同长度的衣服(占用多个夹子),并且每两件衣服中间要有一个空夹子作为空位,下面需要依次晾干几件长度不一的衣服,请你给出某个夹子的使用情...

    【题解】搭配购买

    【题目描述】Joe觉得云朵很美,决定去山上的商店买一些云朵。商店里有n朵云,云朵被编号为1,2,…,n,并且每朵云都有一个价值。但是商店老板跟他说,一些云朵要搭配来买才好,所以买一朵云则与这朵云有搭配...