Skip to content

贪心算法

基本思想

贪心算法并不从整体最优上加以考虑,所做的选择只是某种意义上的局部最优选择。所以贪心算法并不保证的到最优解,但是在某些问题上贪心算法的解就是最优解。

贪心选择

在使用贪心算法之前,必须设立一套贪心选择的规则。使贪心算法在选择时候能有根据的选择局部上的最优。
例如桌子上有5张大小不用的人民币,而你只能拿三张,怎么拿?你肯定会先拿大的,再到小的。这其实就是贪心选择,给人民划分了从大到小的排序,然后从大的拿起。

实战

背包问题

现有3中物品和一背包,背包的容量为50斤。物品1重量是10斤,价值为60元;物品2重量是20斤,价格为100元;物品3重量是30斤,价值为120元。问应如何选择装入背包的物品,使得装入背包中物品的总价值最大?(与0-1背包问题类型,但是可以选取物品的一部分)

js
let goods = [
  {weight: 10, value: 60},
  {weight: 30, value: 120},
  {weight: 20, value: 100}
]

let bag = {
  weight: 0,
  value: 0
};
const MAXWEIGHT = 50

function greedySelect() {
  for(let i=0;i<goods.length;i++) {
    if(bag.weight + goods[i].weight < MAXWEIGHT) {
      bag.value = bag.value + goods[i].value
      bag.weight = bag.weight + goods[i].weight
    }else {
      let tmp = MAXWEIGHT - bag.weight
      bag.value = bag.value + goods[i].value / goods[i].weight * tmp
      bag.weight = bag.weight + tmp
      return
    }
  }
}
// 贪心选择,根据每一斤物品价值大小进行从大到小的排序
goods = goods.sort(function(x, y) {
  return -(x.value / x.weight - y.value / y.weight)
})
greedySelect()