上一道dp题目,难度没上一道难,仔细想一想;
某地举行自行车比赛,使用共享单车,且每隔一公里都有一个换乘点,每次换车最多骑行10公里,假设按骑行公里数收费,且连续骑行1到10公里费用不等。一位选手要骑行 n 公里,那么怎样换乘共享单车,能使得骑行 n 公里总费用最少呢?
输入格式
输入文件名:z.in
第一行为一个正整数 n(≤100),表示选手要骑行的总路程数;第二行共十个正整数(中间空格隔开),第i个正整数表示连续骑行i公里的费用 Wi(≤500)。(注意这些数并无实际的经济意义,即骑行10公里费用可能比骑行1公里的少。)
输出格式
输出文件名:z.out
仅一个正整数,表示最少的费用。
输入/输出例子1
输入:
18
3 5 9 10 6 20 18 10 30 40
输出:
22
算最小值了啦!小菜一碟!
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll m;
ll dp[100000],a[11];
int main(){
freopen("z.in","r",stdin);
freopen("z.out","w",stdout);
memset(dp,0x3f3f3f,sizeof(dp));
cin>>m;
dp[0]=0;
for(ll i=1;i<=10;i++)
cin>>a[i];
for(ll i=1;i<=10;i++)
for(ll j=0;j<=m;j++)
if(j>=i)
dp[j]=min(dp[j],dp[j-i]+a[i]);
cout<<dp[m]<<endl;
return 0;
}