题目:一个城市,公交车每隔1km停一次,公交车票价格随行驶里程1km到10km之间而各不相同,可以分段搭乘来降低到达目的地的费用
比如假设公交费用列表如下:
Distance(km) | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
Bus Fare | 12 | 21 | 31 | 40 | 49 | 58 | 69 | 79 | 90 | 101 |
根据这个费用列表,15km最少费用是147,分解成买一张3km的票,买二张6km的票,或者是3张5km的票,结果都是一样的,其他的搭乘方式费用都更高,给定公交费用
列表和里程,计算搭乘给定里程所花的最小费用
输入样例
12 21 31 40 49 58 69 79 90 101
15
12 20 30 40 25 60 70 80 90 11
21
输出样例
147
34
12 21 31 40 49 58 69 79 90 101
15
12 20 30 40 25 60 70 80 90 11
21
输出样例
147
34
代码:
/*
要走15公里花的最小费用, 走1公里花的费用, 剩余14公里所花的最小费用
假设fare(i)表示走i公里的最小费用,走i公里可以分解成走fare(j) + fare(i-j) ,
所以可以从底往上算, 先算走1公里的最小费用,
再算走2公里的最小费用, 先求出1 到 10 公里的最小费用,再依次往上算
*/
#include<iostream>
#include<cstdio>
using namespace std;
const int MAX = 10001;
const int MAX_FEE = 500;
int main(int argc, char** argv)
{
int T;
cin >> T;
for(int i = 0 ; i < T; i++)
{
//先将已知的最小费用输入,之后不断更新这个值
int bus_fare[MAX];
bus_fare[0] = 0;
int j = 1 ;
for(; j <= 10 ; j++)
{
cin >> bus_fare[j];
}
int distance;
cin >> distance;
for(; j <= distance; j++)
{
bus_fare[j] = MAX_FEE * distance;
}
for(int m = 1 ; m <= distance; m++)
{
for(int n = 1; n < m; n++)
{
if(bus_fare[n] + bus_fare[m-n] < bus_fare[m])
{
bus_fare[m] = bus_fare[n] + bus_fare[m-n];
}
}
}
cout << bus_fare[distance] << endl;
}
}
要走15公里花的最小费用, 走1公里花的费用, 剩余14公里所花的最小费用
假设fare(i)表示走i公里的最小费用,走i公里可以分解成走fare(j) + fare(i-j) ,
所以可以从底往上算, 先算走1公里的最小费用,
再算走2公里的最小费用, 先求出1 到 10 公里的最小费用,再依次往上算
*/
#include<iostream>
#include<cstdio>
using namespace std;
const int MAX = 10001;
const int MAX_FEE = 500;
int main(int argc, char** argv)
{
int T;
cin >> T;
for(int i = 0 ; i < T; i++)
{
//先将已知的最小费用输入,之后不断更新这个值
int bus_fare[MAX];
bus_fare[0] = 0;
int j = 1 ;
for(; j <= 10 ; j++)
{
cin >> bus_fare[j];
}
int distance;
cin >> distance;
for(; j <= distance; j++)
{
bus_fare[j] = MAX_FEE * distance;
}
for(int m = 1 ; m <= distance; m++)
{
for(int n = 1; n < m; n++)
{
if(bus_fare[n] + bus_fare[m-n] < bus_fare[m])
{
bus_fare[m] = bus_fare[n] + bus_fare[m-n];
}
}
}
cout << bus_fare[distance] << endl;
}
}