小彭玉的扫荡食堂计划
Problem Description
嘩啦啦村的食堂很奇怪,就是如果這個飯卡所剩金額低于5元的話,這個飯卡就不能刷了。
也就是說,只要這個飯卡金額大于等于5元,就可以隨便刷~
有一天,小彭玉看了看嘩啦啦食堂的飯,“哇,好好吃!我要全部都買下來!”
但是小彭玉并沒有那么多錢,于是他準備充分利用自己的錢,去買這些食物!
請問最后小彭玉的飯卡余額最少能到多少?
Input
多組測試數(shù)據(最多100組)
第一行 n,表示有n個菜
第二行 接下來n個數(shù)字,a[i]表示第i道菜多少錢
第三行 一個數(shù)m,表示小彭玉的飯卡,一開始有m元
1<=n<=1000,1<=a[i]<=10000,1<=m<=10000
Output
輸出一個整數(shù),表示最后飯卡顯示的金額數(shù)
Sample Input
1
10000
6
10
1 2 3 2 1 1 2 3 2 1
50
Sample Output
-9994
32
就是一個背包的問題,留下最大的,然后算買了其余的菜剩下最接近5的金額,再減去最貴的,就可以了,把錢看成容量,其實就是算m到5的背包。這題我并沒有優(yōu)化常數(shù),結果9s險過……,別人都是5s。
我是直接排序,然后看是否能到那個余額,有點狀態(tài)連接的感覺,但是費時。
這是背包九講里的tips,當時沒注意
一個常數(shù)優(yōu)化
前面的偽代碼中有 for v=V..1,可以將這個循環(huán)的下限進行改進。
由于只需要最后f[v]的值,倒推前一個物品,其實只要知道f[v-w[n]]即可。以此類推,對以第j個背包,其實只需要知道到f[v-sum{w[j..n]}]即可,即代碼中的
for i=1..N
for v=V..0
可以改成
for i=1..n
bound=max{V-sum{w[i..n]},c[i]}
for v=V..bound
這對于V比較大時是有用的。
總結
以上是生活随笔為你收集整理的小彭玉的扫荡食堂计划的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Databricks Secrets(机
- 下一篇: 微服务(Microservice)那点事