【背包问题】

本文详细解析了0-1背包和完全背包问题,通过JavaScript代码展示了如何使用动态规划解决这两种经典的组合优化问题。首先介绍了0-1背包问题,涉及物品体积和价值,以及如何求解背包容量下最大价值。接着扩展到完全背包问题,允许无限数量的物品。通过实例演示,帮助读者理解并掌握这两种问题的解题策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、0-1背包问题

有一个容量为 C 的背包,和一些物品。这些物品分别有两个属性,体积 w 和价值 v,每种物品的数量只有一个。要求用这个背包装下价值尽可能多的物品,求该最大价值,背包可以不被装满。

假设物品的体积w[i]=[5,6,2,3,4],物品的价值v[i]=[6,12,5,6,6],背包容量C=10,求背包能装的最大价值。

funciton bag_0_1(w,v,C) {
	// 先对F[i][j]初始化第一行,然后根据遍历物品,根据状态转移函数计算。
	// 把F第一行初始化为0,否则有的编译器通过不了;
	let F = Array.from(Array(1), () => Array(10).fill(0));
	// 用于动态规划的第一行数据: 只装走第一个物品的最大值
	for(let j = 0; j <= C; j++) {
		// 如果重量大于第一个物品的重量,也即是能装下,那么最大价值如下:
		if(j >= w[0]) {
			F[0][j] = v[0];
		}
	}
	// F[i][j]前i+1个物品中,当最大背包容量为j时,背包能装载的最大价值
	for(let i = 1; i < w.length; i++) {
		for(j = 0; j <= C; j++) {
			// 如果背包容量可以装下当前物品,那么最大价值:(1)不装当前物品(2)装当前物品
			if(j >= w[i]) {
				F[i][j] = Math.max(F[i-1][j], F[i-1][j-w[i]] + v[i])
			} else {
				F[i][j] = F[i-1][j];
			}
		}
	}
	return F[w.length-1][C];
}

【leetCode题目实战】

2、完全背包问题

有一个容量为 C 的背包,和一些物品。这些物品分别有两个属性,体积 w 和价值 v,每种物品的数量都有无限个。要求用这个背包装下价值尽可能多的物品,求该最大价值,背包可以不被装满。

funciton bag_0_1(w,v,C) {
	// 先对F[i][j]初始化第一行,然后根据遍历物品,根据状态转移函数计算。
	// 把F第一行初始化为0,否则有的编译器通过不了;
	let F = Array.from(Array(1), () => Array(10).fill(0));
	// 确定动态规划的边界,初始化
	for(let j = 0; j <= C; j++) {
		// 当i=0时,F[0][j]表示只考虑第一件物品,容量为j的背包中能装载的最大价值。因为背包智能装一件物品,那么当然要尽可能多地装,所以F[0][j]=(j/w[0])*v[0]
		F[0][j] = (j/w[0]) * v[0];
	}
	// F[i][j]前i+1个物品中,当最大背包容量为j时,背包能装载的最大价值
	for(let i = 1; i < w.length; i++) {
		for(j = 0; j <= C; j++) {
			//状态转移方程的处理
            // 不放
            F[i][j]=F[i-1][j];
            // 放n个
            let k=j/w[i];
            while(k)
            {
                F[i][j]=max(F[i][j],F[i-1][j-k*w[i]]+k*v[i]);
                k--;
            }  
		}
	}
	return F[w.length-1][C];
}

【leetCode题目实战】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值