贪心算法的解决

今天做了一家公司的笔试题,里面一道编程题就是贪心算法来解决的,就是类似经典的背包问题。之前只是看过,笔试的时候凭借印象居然做出来80%,心情非常愉悦,记录一下。

原来的题目我不记得了,写个类似的题目。

背包问题是一个组合优化的问题,描述如下:给一个固定大小,能够携重W的背包以及一组有价值重量的物品,找出一个最佳的方案,使得装入包中的物品重量不超过W且总价值最大。

1、问题分析

数据:物品个数n=5,物品重量weights=[2,2,6,5,4],物品价值values=[6,3,5,4,6],背包总容量W=10。

2、问题思路

  * 先计算出每一个物品的性价比,就是重量/价值,得到每个物品的性价比,存进去一个数组,按照从小到大排列。之后遍历这个数组,在容量>=0之前,增加max的值。

  * 代码如下:

let price = [2,2,3,1,5,2];  // 价格
let nums  = [2,3,1,5,4,3];  // 对应的数量
let money = 6;              // 有多少钱

tanxin(price,nums,money)
function tanxin(price,nums,money){
    // 要返回的值
    let max = 0;
    // 现在剩下多少钱
    let endMoney = money;
    let arr = [];
    // 遍历价格,把价格,数量,和比例存进一个数组
    price.forEach((ele,idx)=>{
        arr.push({
            'price':price[idx],
            'num':nums[idx],
            'bili':price[idx]/nums[idx]
        })
    })
    // 做一下排序,从小到大排
    arr.sort((a,b)=>{
       return a.bili - b.bili
    })
    // 遍历物品数组
    arr.forEach((ele,idx)=>{
        // 需要限定当大于0时,不然会一直加下去
        if(endMoney - ele.price>=0){
            // 剩下的钱减少
            endMoney = endMoney - ele.price;
            // 可以买的物品最大数量增加
            max += ele.num
        }
    })
    console.log(max) 
}

  

猜你喜欢

转载自www.cnblogs.com/linxf/p/12589624.html
今日推荐