问题描述:给定 n 个物品,第 i 个物品的重量为 wgt[i−1]、价值为 val[i−1] ,和一个容量为 cap 的背包。每个物品只能选择一次,但可以选择物品的一部分,价值根据选择的重量比例计算,问在限定背包容量下背包中物品的最大价值

贪心算法

  • 计算每件物品的单位重量价值:val[i-1]/wgt[i-1] 按照每件物品的单位重量价值进行排序
  • 遍历所有物品,每轮贪心地选择单位价值最高的物品
  • 若剩余背包容量不足,则使用当前物品的一部分填满背包。
const wgt=[2,5,3,7,5]
const val=[3,10,4,2,20]
const cap= 14
class Item{
    constructor(w,v){
        this.w=w;
        this.v=v;
    }
   }
function scoreBackpack(val,wgt,cap){
    const items=val.map((v,i)=>
        new Item(wgt[i],v)
    )
    //按照单位重量价值来从高到低进行排序
    items.sort((a,b)=>b.v/b.w-a.v/a.w)
    let res=0;
    //遍历每个物品,按照排序号的items来放进背包
    for (const item of items) {
        //如果当前item能放进背包
        if(item.w<cap){
            res +=item.v;
            cap -=item.w;
        }else{
            //不能,就将部分item放进背包
            res+= (item.v/item.w) * cap
            //无剩余容量就跳出循环
            break
        }
    }
    return res
}

reference