【完全背包】最小乘车费用
2012-11-06 18:36
274 查看
题目:最小乘车费用 rqnoj169
题目描述
假设某条街上每一公里就有一个公共汽车站,并且乘车费用如下表:公里数 1 2 3 4 5 6 7 8 9 10
费用 12 21 31 40 49 58 69 79 90 101
而任意一辆汽车从不行驶超过10公里。某人想行驶n公里,假设他可以任意次换车,请你帮他找到一种乘车方案,使得总费用最小
注意:10公里的费用比1公里小的情况是允许的。
输入格式
共两行,第一行为10个不超过200的整数,依次表示行驶1~10公里的费用,相邻两数间用一个空格隔开;第二行为某人想要行驶的公里数(<=100)。输出格式
仅一行,包含一个整数,表示行使这么远所需要的最小费用。样例输入
12 21 31 40 49 58 69 79 90 10115
样例输出
147既然可以任意换乘,那么假设一个人乘车(1,2,3)(1,2,3,4,5,6,7,8)(1,2) 这个应该看得懂吧,表示一个人第一次乘车走了3公里,然后换乘,走了8公里,又换乘,走了2公里
那么把这个整合一下即为(1,1,1,2,2,2,3,3,4,5,6,7,8) 也就是说我们可以把每公里的单价看做物品的价值,一公里看做物品的体积,然后公里数看做体积,所以就成了每个物品可以有无限个(不懂得可以再想想,如果换乘无数次,那么必然就有无数个1,甚至无数个2,3,4,5,6.....)这就是完全背包模型!
至于代码实现,这里简略说一下可以用就地滚动正序枚举的副作用来实现
Pascal Code
program rqnoj169; var n:longint; a:array[0..10] of longint; f:array[0..100+10] of longint; procedure init; begin assign(input,'rqnoj169.in'); assign(output,'rqnoj169.out'); reset(input); rewrite(output); end; procedure outit; begin close(input); close(output); halt; end; procedure readdata; var i:longint; begin for i:=1 to 10 do read(a[i]); read(n); end; procedure main; var i,j:longint; begin fillchar(f,sizeof(f),$7); f[0]:=0; for i:=1 to 10 do for j:=i to n do begin if f[j]>f[j-i]+a[i] then f[j]:=f[j-i]+a[i]; end; writeln(f ); end; begin init; readdata; main; outit; end.
相关文章推荐
- 【完全背包】最小乘车费用
- 第五讲 二维费用的背包问题 HD FATE(二维完全背包)
- 最小乘车费用
- 最小乘车费用
- hdu1114 Piggy-Bank(完全背包,求最小价值)
- 公路乘车(完全背包)
- 最小乘车费用(动态规划)
- hdu1114——Piggy-Bank(完全背包求最小价值)
- HDU 2159 FATE 【二维费用完全背包】
- HDU 1114 Piggy-Bank (完全背包 + 取最小值)
- 1417 最小乘车费用(busses)
- (ssl 1697)最小乘车费用
- XYNUOJ 最小乘车费用
- HDU2159_FATE【二维费用背包】【完全背包】
- SSL P1643 最小乘车费用 题目
- HDU 3496 Watch The Movie -- 二维费用背包 费用刚好完全消耗
- HDU1114题Piggy-Bank(最小值的完全背包)
- 多重背包-hdu2191,完全背包-hdu4508,二维费用背包hdu2159
- 【例题】【动规(分组)】NKOJ 1001 最小乘车费用
- 最小乘车费用