贪心算法在解决问题的策略上是根据当前已有的信息做出选择,而且一旦做出选择,不管将来有什么结果,这个选择都不会改变。
贪心算法并不是从整体最优考虑,而是某种意义上的局部最优。这种局部最优选择并不能保证你总能获得全局最优解,但通常能得到较好的近似最优解。
贪心算法在每一步总是选择当前情况下的最优策略,它与分治法类似,都会把求解的问题划分成若干个小问题,每个小问题利用贪心策略求得其最优解,再组合这些小问题的最优解便能获得原问题的解。
性质
- 最优子结构。当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构。
- 贪心选择性质。指问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来得到。
举栗子
- 假如某种货币的硬币有如下几种面值:1元,5元,10元,25元,50元,100元,且数量不限。如果给定需为某客户找零的数额amount_rem,那么如何组合该货币的几种面值,从而使得客户所得找零的张数最少。
//硬币找零
function give_free(money) {
let free_arr = [1,5,10,25,100]
let free = free_arr.reverse();
let i = 0;
let amount_rem = [];
while(money > 0) {
let older = parseInt(money / free[i]);
money = money % free[i];
for(let j=0; j<older; j++){
amount_rem.push(free[i])
}
i++;
}
return amount_rem;
}
console.log(give_free(48));
//[25,10,10,1,1,1]