代码改变世界

js贪心算法---背包问题

2018-07-30 16:39  muamaker  阅读(1375)  评论(0编辑  收藏  举报
		/*
		 * @param {Object} capacity 背包容量 6
		 * @param {Object} weights  物品重量 [2,3,4]
		 * @param {Object} values   物品价值  [3,4,5]
		 */
		
		//贪心算法,只能算,可以分割的物品,如果不能分割物品,只能得到近似解,不分割物品,可以使用动态规划
		//1、计算每件商品的(价格/质量),即单位质量的价值
		//2、将单位质量价值排序
		//3、逐个取出
		
		console.log(tanx(6,[2,3,4],[3,4,5]));
		
		function tanx(capacity,weights,values){
			var list  = [];
			for(var i = 0,len = weights.length; i < len; i++){
				list.push({
					num:i+1,  //第几件商品
					w:weights[i], //重量
					v:values[i],
					rate:values[i]/weights[i]  
				});
			}
			
			list.sort(function(a,b){
				if(a.rate  > b.rate){
					return -1;
				}else{
					return 1;
				}
			});
			
			var selects = [];
			var total = 0;
			for(var i = 0,len = list.length; i < len; i++){
				var item = list[i];
				
				if(item['w'] <= capacity){
					selects.push({
						num:item.num,
						rate:1 ,       //完整的商品记录为1
						v:item.v,
						w:item.w
					});
					
					total = total + item.v;
					capacity = capacity - item.w;
				}else if(capacity > 0){
					//选取不完整的商品
					var rate = capacity/item['w'];
					var v = item.v*rate;
					selects.push({
						num:item.num,
						rate: rate,
						v:item.v*rate,
						w:item.w*rate
					});
					total = total + v;
					break;
				}else{
					break;
				}
			}
			
			return {
				selects,
				total
			}
		}