公交汽车(动态规划)
题目描述一个特别的单行街道在每公里处有一个汽车站。顾客根据他们乘坐汽车的公里使来付费。例如下表就是一个费用的单子。 没有一辆车子行驶超过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;
}