摘要:
这是一道01背包的问题,但是有一个地方我没有想到,所以花了很多时间。 题目给了每个银行的钱和被抓的概率,由于要抢尽量多的钱,所以要保证尽量不被抓,而抢多个银行之后不被抓的概率是抢每一个银行不被抓的概率之积,我竟然把这一点给忘了!导致我走了许多弯路,思路不能太死啊!dp[]表示抢到下标所对应的钱时,此时不被抓的概率,题目给出了最终不能高于被抓概率P,不被抓的概率就不能低于(1-P),所以最后只需要逆序遍历dp,找到第一个大于等于1-P的dp[i],就能够保证i最大,即抢到的钱最多。#include<stdio.h>#include<string.h>#define MAX 阅读全文
posted @ 2012-07-28 20:29
等待电子的砹
阅读(1199)
评论(0)
推荐(1)
摘要:
这是一道01背包的变体。题目加了限制条件,当卡上金额大于等于5元时才能购买成功,我们不妨将这里的5元视为“0“,因为在DP过程中金额不能低于5,所以最后要用到的结果应该是dp[m-5]。既然我们保证了余额一直是大于等于5的,那么最后还能购买一次,所以,我们将最贵的一样菜留在最后,在DP的过程结束之后再购买,这样就能保证最后的余额最少。 开始,我在写这道题的时候由于觉得要剩5元,于是将循环改为了 for i 1 to n for j m+5 to 5 这样也是可以的,只是要注意最后结果应该使用dp[m],而不是dp[m+5]... 阅读全文
posted @ 2012-07-28 11:35
等待电子的砹
阅读(793)
评论(0)
推荐(1)
浙公网安备 33010602011771号