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

请教,一个问题满足什么样的条件才能保证贪心算法可以得出最优解?
在看书的时候遇到一个“找零钱”问题:目标是找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

相关推荐

不愿透露姓名的神秘牛友
11-26 18:54
说等下个版本吧的发呆爱好者很贪睡:佬最后去了哪家呀
点赞 评论 收藏
分享
10-25 23:12
门头沟学院 Java
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务