题意理解
有n种药水,药水的体积都是V,每种药水的药物浓度是Pi,1<=i<=n,现将一种或几种药水混合,要求混合后的药水浓度不大于W,每种药水要么全部混合,要么不混合,求混合后药水的最大体积和对应的浓度?
问题分析
用贪心法,要是混合后的药水体积最大,那么药水的数量就要最多;要使药水的浓度尽可能小,那么选择的药水浓度就要尽可能小。那么,贪心策略就是,每次选择最小浓度的药水混合,直到药水浓度接近或等于W即可。以Pi,Pj两个最小药水混合为例,混合后的药水浓度(Pi * V+Pj * V)/ (2 * V) = (Pi+Pj)/2。所以判断条件为 (P1 + P2 + ... + Pk) / k <= W。
其他
贪心法两个要点:
贪心选择性质:应用同一规划,将原问题变为一个相似的但规模更小的子问题
局部最优解:每一次都取得了最优解。比动态规划算法效率更高,占用内存更少,编写程序更简单。
代码链接
https://github.com/xierensong/learngit/blob/master/hdu/h2570.cpp