您的位置:首页 > 其它

NOJ 1401 乘车费用 (线性dp 0/1背包)

2014-11-25 11:03 357 查看

乘车费用

时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte

描述

lqp家离学校十分十分远,同时他又没有钱乘taxi。于是他不得不每天早早起床,匆匆赶到公交车站乘车到学校。众所周知CZ是个公交车十分发达的地方,但是CZ的公交车十分的奇怪,lqp到学校的这段路上每一公里就有一公交车站,乘车费用如下表:

公里数 1 2 3 4 5 6 7 8 9 10

费用 12 21 31 40 49 58 69 79 90 101

而一辆汽车从不行驶超过10公里。lqp家距离学校n公里(不会超过100公里),假设他可以任意次换车,请你帮他找到一种乘车方案使费用最小(10公里的费用比1公里小的情况是允许的)。

输入

输入共两行,第一行为10个不超过100的整数,依次表示行驶1~10公里的费用,相邻两数间用空格隔开;第二行为lqp想要行驶的公里数(<=100)。



输出

输出仅一行包含一个整数,表示该测试点的最小费用。

样例输入

12 21 31 40 49 58 69 79 90 101

15

样例输出

147

题目来源
JSOI2010

题目链接:http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1401

题目分析:完全背包问题,每个车次都可以使用无数次

#include <cstdio>
#include <algorithm>
using namespace std;
int const INF = 0xfffffff;
int v[11], w[11], d, dp[105];
int main()
{
    for(int i = 1; i < 11; i++)
    {
        w[i] = i;
        scanf("%d", &v[i]);
    }
    for(int i = 1; i < 105; i++)
        dp[i] = INF;
    scanf("%d", &d);
    for(int i = 1; i < 11; i++)
        for(int j = w[i]; j <= d; j++)
            dp[j] = min(dp[j], dp[j - w[i]] + v[i]);
    printf("%d\n", dp[d]);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: