怎么确定什么时候可以用贪心

请教,一个问题满足什么样的条件才能保证贪心算法可以得出最优解?
在看书的时候遇到一个“找零钱”问题:目标是找67分,面值有25、10、5、2、1,目标是所用硬币数量最少。此问题用贪心可得最优解,即每次拿出不会导致总面值超过目标面值的最大面值:25+25+10+5+2=67。
但是,如果换成目标面值10分,面值种类有7、5、1,那么贪心法就不好用了,因为7+1+1+1=5+5。
想到这里,就想请教大家,一个问题满足什么样的条件才能保证贪心算法可以得出最优解?#笔试题目#
全部评论
可以用动态规划, dp[i]=min j {dp[i-j]+1} 。这道题一般是不能用贪心的,之所以第一种情况可以用的原因如下:67去掉尽可能多个25,也就是去掉两个25,剩下17,17的最少组合是10,5,2这三个硬币。如果不使用25,67减去尽可能多的10之后,剩下7,最优组合是5,2, 1也是三个硬币。而67里能减去25的个数肯定小于等于能减去10的个数,所以最优解是尽可能减去25。同样的道理,对于10,5,2这三个面值,也可以得出结论,优先使用大面值一定是最优解。
点赞 回复 分享
发布于 2019-05-13 00:49
昨天写的分析不太对,重发一下。这道题是要用动态规划的, dp[i]=min j {dp[i-j]+1}。这道题一般是不能用贪心的,第一种情况可以用贪心只是因为可供找零的面值很特殊,但是它的证明我也不会。总之只是可供找零的面值满足某个条件的时候,贪心算法恰好能得到最优解
点赞 回复 分享
发布于 2019-05-13 11:17

相关推荐

05-12 17:00
门头沟学院 Java
king122:你的项目描述至少要分点呀,要实习的话,你的描述可以使用什么技术,实现了什么难点,达成了哪些数字指标,这个数字指标尽量是真实的,这样面试应该会多很多,就这样自己包装一下,包装不好可以找我,我有几个大厂最近做过的实习项目也可以包装一下
点赞 评论 收藏
分享
VirtualBool:都去逗他了?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务