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

【题解】公交乘车

亿万年的星光11个月前 (02-08)题解目录941

【题目描述】

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;
}


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

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

分享给朋友:

相关文章

【题解】队列问题

【题解】队列问题

4.队列问题(lru.cpp)【题目描述】有一个大小为n的页面缓存队列,初始为空,当计算机访问页面时,若缓存队列没有该页面,则加入到缓存队列中,若队列已满,则将删除访问时间最远的页面。有Q次询问,每次...

【题解】打击犯罪

【题目描述】某个地区有n(n<=1000)个犯罪团伙,当地警方按照他们的危险程度由高到低给他们编号为1-n,他们有些团伙之间有直接联系,但是任意两个团伙都可以通过直接或间接的方式联系,这样这里就...

【题解】结构体与闰年

【题目描述】定义一个结构体变量(包括年、月、日)。计算该日在本年中是第几天,注意闰年问题。【输入描述】年月日【输出描述】当年第几天【样例输入】2000 12 31【样例输出】366...

【题解】合根植物

【题解】合根植物

【题目描述】w星球的一个种植园,被分成 m * n 个小格子(东西方向m行,南北方向n列)。每个格子里种了一株合根植物。这种植物有个特点,它的根可能会沿着南北或东西方向伸展,从而与另一个格子的植物合成...

求正整数2和n之间的完全数

【题目描述】求正整数2和n之间的完全数(一行一个数)。完全数:因子之和等于它本身的自然数,如6=1+2+3【输入描述】输入n【输出描述】一行一个数,按由小到大的顺序。【输入样例】7【输出样例】6#in...

质数环

【题目描述】有一个整数n,把从1到n的数字无重复的排列成环,且使每相邻两个数(包括首尾)的和都为素数,称为素数环。为了简便起见,我们规定每个素数环都从1开始。例如,下面就是6的一个素数环。1 4 3...