今天做了一家公司的笔试题,里面一道编程题就是贪心算法来解决的,就是类似经典的背包问题。之前只是看过,笔试的时候凭借印象居然做出来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) }
原文:https://www.cnblogs.com/linxf/p/12589624.html