动态规划的背包问题

在这里插入图片描述
主要原理是将一个大背包拆成小背包,看每个小背包中能转载的最大价值,以下是每个格子的最大价值公式
ceil[ i ][ j ]=max( ceil[ i-1 ][ j ] ,i行的价值+ ceil[ i-1 ][ j- i行的价值])
在这里插入图片描述

		/*
		@param [[cost,value],[cost,value]] 商品的花费和价格数组
		@param opacity 容量
		@param opint 粒度
		@return maxValue	
    	*/
    	function package(arr,opacity,point=1){
    		let valueArr=new Array(arr.length);
    		for(let i=0;i<arr.length;i++){
    			valueArr[i]=[];
    		}
    		for(let i =0;i<arr.length;i++){
    			const itemCost=arr[i][0];
    			const itemValue=arr[i][1];
    			for(let j=0;j<=opacity;){
    				if(i==0){
    					valueArr[i][j]=j>=itemCost?itemValue:0;
    				}else{
    					const extraCost=j>=itemCost?(itemValue+valueArr[i-1][j-itemCost]):0;
    					valueArr[i][j]=Math.max(valueArr[i-1][j]||0,extraCost)
    				}
    				j+=point
    			}
    		}
    		return valueArr[arr.length-1][opacity/point]
    	}
    	const itemArr=[[4,3000],[1,15000],[3,222000]];
    	const opacity=4;
    	console.log(package(itemArr,opacity));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值