公交汽车(动态规划)

公交汽车(动态规划)

题目描述一个特别的单行街道在每公里处有一个汽车站。顾客根据他们乘坐汽车的公里使来付费。例如下表就是一个费用的单子。 没有一辆车子行驶超过10公里,一个顾客打算行驶n公里(1< =n< =100),它可以通过无限次的换车来完成旅程。最后要求费用最少。输入 第一行十个整数分别表示行走1到10公里的费用(< =500)。注意这些数并无实际的经济意义,即行驶10公里费用可能比行驶一公里少。
第二行一个整数n表示,旅客的总路程数。输出仅一个整数表示最少费用。
样例输入12 21 31 40 49 58 69 79 90 101
15
样例输出147

这道题做完的同学可以去看看求最大值(动态规划),题目的思想很相似,这题比较简单哈,我们用dp[i]表示前i公里的最优解,我们i需要从1一直叠加到题目所求的公里数~~~~假设当前是第5公里 (i=5),那么我们需要不断的筛选 dp[1]+dp[4] dp[2]+dp[3] 所有方案中的最优解 我们让j从1枚举到i-1那么 公式可写成dp[i]=min(dp[i],dp[j]+dp[i-j])即可

废话不多说上代码

#include<iostream>
#include<algorithm>
using namespace std;
const int N=105;
int car[N],dp[N];
int INF=1e7;
int main()
{
    int m;
    for(int i=1;i<=500;i++)
    {
        dp[i]=INF;
    }
    for(int i=1;i<=10;i++)
    {
        cin>>car[i];
        dp[i]=car[i];
    }
    cin>>m;
    for(int r=1;r<=m;r++)
    {
        for(int l=1;l<r;l++)
        {
            dp[r]=min(dp[r],dp[l]+dp[r-l]);
        }
    }
    cout<<dp[m];
    return 0;
}
发布了10 篇原创文章 · 获赞 0 · 访问量 191

猜你喜欢

转载自blog.csdn.net/weixin_44460602/article/details/104432338