题目描述
一个特别的单行街道在每公里处有一个汽车站。顾客根据他们乘坐汽车的公里使来付费。例如下表就是一个费用的单子。没有一辆车子行驶超过10公里,一个顾客打算行驶n公里(1<=n<100),它可以通过无限次的换车来完成旅程。最后要求费用最少。
输入
第一行十个整数分别表示行走1到10公里的费用(<=500)。注意这些数并无实际的经济意义,即行驶10公里费用可能比行驶一公里少。第二行一个整数n表示,旅客的总路程数。
输出
仅一个整数表示最少费用。
样例输入
12 21 31 40 49 58 69 79 90 101 15
样例输出
147
算法描述
本题可采用动态规划算法。
将输入的10个数据用w[i]存储,设p[i]表示行驶i公里的最小费用,最终目标是求出p[n].
下面给出状态转移方程:
- 当i=1时,无需作任何比较:
- 当i>1时,当求行驶i公里的最小费用时,我们需要将所有公里数之和等于i的分配情况进行比较,从中选取最小值,因为p[i]中记录的已是此前情况下的最小费用,所以我们只需从p[j]与p[i-j]加和的所有可能结果中选取最小值。即:
需要考虑到w[i]的值,这里我们初始化p[i]=w[i].
有了状态转移方程,我们便很容易求得p[n]的值。
c++代码
#include<iostream>
using namespace std;
int main()
{
int w[11];
for (int i = 1; i < 11; i++)
{
int x;
cin >> x;
w[i] = x;
}
int n;
cin >> n;
int* p = new int[n + 1];
for (int i = 0; i <= n; i++)
p[i] = 0;
p[1] = w[1];
for (int i = 2; i < n+1; i++)
{
int temp = i > 10 ? 1000000 : w[i];
for (int j = 1; j <= i / 2 ; j++)
if (p[j] + p[i - j] < temp)
temp = p[j] + p[i - j];
p[i] = temp;
}
cout << p[n] << endl;
}