最小乘车费用

题目描述:

某条街上每一公里就有一汽车站,乘车费用如下表:

公里数 --------- 费用
1 ---------------- 12
2 ---------------- 21
3 ---------------- 31
4 ---------------- 40
5 ---------------- 49
6 ---------------- 58
7 ---------------- 69
8 ---------------- 79
9 ---------------- 90
10 ---------------- 101(重新排版很累人的……)

而一辆汽车从不行驶超过10公里。某人想行驶n公里,假设他可以任意次换车,请你帮他找到一种乘车方案使费用最小(10公里的费用比1公里小的情况是允许的)。

编一程序:

从文件BUSSES.IN中读入对乘车费用的描述;算出最小的价格;把结果写入文件BUSSES.OUT中。

输入:

输入文件共两行,第一行为10个不超过100的整数,依次表示行驶1~10公里的费用,相邻两数间用空格隔开;第二行为某人想要行驶的公里数。

输出:

输出文件仅一行包含一个整数,表示该测试点的最小费用。

样例输入:

12 21 31 40 49 58 69 79 90 101
15

样例输出:

147

首先分析一下题意:这个小家伙要坐车,每走一公里就会有相应的费用,所以给出一个距离,求花费费用的最小值。
那么可以用贪心的办法。但是——本标签是DP,所以还是用DP的比较好吧……
先上代码:

#include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int f[21],dp[111];
    int n;
    int main()
    {
        memset(dp,127,sizeof(dp));
        for(int i=1;i<=10;i++)
            scanf("%d",&f[i]);
        scanf("%d",&n);
        dp[0]=0;
        dp[1]=f[1];
        for (int i=2;i<=n;i++)
        {
            dp[i]=dp[i-1]+f[1];
            for (int j=2;j<=10 && j<=i;j++)
            dp[i]=min(dp[i],dp[i-j]+f[j]);
        }
        printf("%d",dp[n]);
        return 0;
    } 

这里有好多东西啊!!!
先看那个memset,此处的“127”代表的是INF,所以你不需要担心dp的值啦;但是——你会看到main里有一个dp[0]=0,这就是为了补充那个memset,因为memset把0的值也给复制过来了,所以必须得初始化dp[0]的值。
然后,下面还有一个dp[1]=f[1],意思就是说当dp[]=1的时候,它就等于f[1]的值(反正很好理解,这里就不多做解释了……)。
还有!!!千万别忘了,你求的是min!!!不是max!!!(如果您要用k来更新的话,也不要忘了把k整的很大啊……)

原文地址:https://www.cnblogs.com/Zhoier-Zxy/p/8067453.html