SSLOJ 1643 最小乘車費用
阿新 • • 發佈:2020-12-12
技術標籤:dp
Description
假設某條街上每一公里就有一個公共汽車站,並且乘車費用如下表:
而任意一輛汽車從不行駛超過10公里。某人想行駛n公里,假設他可以任意次換車,請你幫他找到一種乘車方案,使得總費用最小
注意:10公里的費用比1公里小的情況是允許的。
Input
輸入檔案BUSSES.IN,檔案共兩行,第一行為10個不超過200的整數,依次表示行駛1~10公里的費用,相鄰兩數間用一個空格隔開;第二行為某人想要行駛的公里數。
Output
輸出檔案BUSSES.OUT,僅一行,包含一個整數,表示行使這麼遠所需要的最小費用。
Sample Input
12 21 31 40 49 58 69 79 90 101
Sample Output
147
思路
吐槽時間到
注意是恰好n公里,不是至少n公里
吐槽時間結束
設b[i]為剛好i公里的最小費用,a[i]為走i公里的費用
b
[
i
]
=
m
i
n
(
b
[
i
]
,
b
[
i
−
j
]
+
a
[
j
]
)
(
1
<
=
i
<
=
n
,
1
<
=
j
<
=
10
)
b[i]=min(b[i],b[i-j]+a[j])(1<=i<=n,1<=j<=10)
b[i]=min(b[i],b[i−j]+a[j])(1<=i<=n,1<=j<=10)
前10個b[x]初值為a[x]
#include<iostream>
#include<cstring>
using namespace std;
int a[11],b[10001],n;
int main()
{
memset(b,0x7f7f,sizeof(b));
for (int i=1;i<=10;i++)
{
cin>>a[i];
b[i]=a[i];
}
cin>>n;
for (int i=1;i<=n;i++)
{
for (int j=1;j<=10;j++)
{
if (i>=j) b[i]= min(b[i],b[i-j]+a[j]);
}
}
cout<<b[n];
return 0;
}