题目链接
https://www.dotcpp.com/oj/contest4162_problem3.html?sid=6567633&lang=0#editor
题目描述
一个特别的单行街道在每公里处有一个汽车站。顾客根据他们乘坐汽车的公里使来付费。例如下表就是一个费用的单子。 没有一辆车子行驶超过10公里,一个顾客打算行驶n公里(1< =n< =100),它可以通过无限次的换车来完成旅程。最后要求费用最少。
输入
第一行十个整数分别表示行走1到10公里的费用(< =500)。注意这些数并无实际的经济意义,即行驶10公里费用可能比行驶一公里少。 第二行一个整数n表示,旅客的总路程数。
输出
仅一个整数表示最少费用。
样例输入
12 21 31 40 49 58 69 79 90 101 15
样例输出
147
解题思路
一:此题为动态规划问题,所以将问题一步步简化,如:先计算每增加一公里所需要的钱数;
二:定义一个数组,假设为b[N],i表示走的公里数,b[i]表示走i公里数应付的费用;
三:用b[i-j-1]+a[j]与b[i]相比,求出最小的公里数;
代码
#include<stdio.h>
int main()
{
int a[10],n,i,j,k,b[10000];
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);//输入费用
}
scanf("%d",&n);//输入公里数
b[0]=0;
for(i=1;i<=n;i++)
{
b[i]=10000;
for(j=0;j<10;j++)
{
if(i>=j+1)//防止重新走的公里数超过总公里数
{
b[i]=(b[i-1-j]+a[j])<b[i]?(b[i-1-j]+a[j]):b[i];//比较每种可能,求出最小值,a[j]表示重新走的公里数所需要的费用,b[i-j-1]表示已走的减去重新走的最小的费用
}
}
}
printf("%d",b[n]);
return 0;
}