P a r t Part Part 1 1 1 读题
一个特别的单行街道在每公里处有一个汽车站。顾客根据他们乘坐汽车的公里数来付费。例如下表就是一个费用的单子。
没有一辆车子行驶超过
10
10
10公里,一个顾客打算行驶
n
n
n公里(
1
≤
n
≤
100
1≤n≤100
1≤n≤100),它可以通过无限次的换车来完成旅程。最后要求费用最少。
输入格式
第一行:十个整数,分别表示行走 1 1 1到 10 10 10公里的费用(费用 s ≤ 500 s≤500 s≤500)。
注意这些数并无实际的经济意义,即行驶 10 10 10公里费用可能比行驶 1 1 1公里少。
第二行:一个整数 n n n,表示旅客的总路程数。
输出格式
仅一个整数,表示最少费用。
输入样例
12 21 31 40 49 58 69 79 90 101
15
输出样例
147
数据范围与提示
对于 100 % 100\% 100%的数据, 1 ≤ n ≤ 100 1≤n≤100 1≤n≤100,费用 s ≤ 500 s≤500 s≤500
P a r t Part Part 2 2 2 思路
看到题目,很显然,这就是动态规划中的完全背包问题,我们先列个表,找一下状态转移方程(本处作者以题目中的前
4
4
4个进行举例)
由此,我们不难可以得出,状态转移方程是
f
[
j
]
=
m
i
n
(
f
[
j
]
,
f
[
j
−
i
]
+
a
[
i
]
)
f[j]=min(f[j],f[j-i]+a[i])
f[j]=min(f[j],f[j−i]+a[i])
最困难的部分解决了,接下来只需要写上其他就可以啦!
小tip:大家可以先根据思路,写一下代码哦!
P a r t Part Part 3 3 3 代码
#include<bits/stdc++.h>
using namespace std;
int n,f[105],a[15];
int main(){
for(int i=1;i<=10;i++)cin>>a[i];
cin>>n;
memset(f,0x3f3f3f,sizeof(f));
f[0]=0;
for(int i=1;i<=10;i++)for(int j=i;j<=n;j++)f[j]=min(f[j],f[j-i]+a[i]);
cout<<f[n];
return 0;
}
听完后,是不是觉得很简单呢?赶快自己去试一下吧!!!