1. 程式人生 > 其它 >SSLOJ 1643 最小乘車費用

SSLOJ 1643 最小乘車費用

技術標籤: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

15

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[ij]+a[j])(1<=i<=n,1<=j<=10)
前10個b[x]初值為a[x]

code:

#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; }