Leetcode 0/1背包问题

本文介绍了LeetCode中的0/1背包问题,讲解了如何在给定容量的背包中选择物品以最大化价值总和。解题步骤包括建立模型、寻找约束条件、找到递推关系式并进行填表,最后给出问题的最优解。通过实例展示了当背包容量和物品体积相等时的选择策略,并提供了相关代码实现。
摘要由CSDN通过智能技术生成

Leetcode 0/1背包问题


什么是背包问题?

比如有n个物品,它们有各自的体积和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和?(0/1背包问题就是这n个物品中某一个物品选还是不选,分别表示1和0)

题目描述

比如有n个物品,它们有各自的体积w和价值v,现有给定容量的背包bagV,如何让背包里装入的物品具有最大的价值总和?

解题步骤:
在解决问题之前,为描述方便,首先定义一些变量:Vi表示第 i 个物品的价值,Wi表示第 i 个物品的体积,定义V(i,j):当前背包容量 j,前 i 个物品最佳组合对应的价值,同时背包问题抽象化(X1,X2,…,Xn,其中 Xi 取0或1,表示第 i 个物品选或不选)。

1、建立模型,即求max(V1X1+V2X2+…+VnXn);

2、寻找约束条件,W1X1+W2X2+…+WnXn<capacity;

3、寻找递推关系式,面对当前商品有两种可能性:

  • 包的容量比该商品体积小,装不下,此时的价值与前i-1个的价值是一样的,即V(i,j)=V(i-1,j);
  • 还有足够的容量可以装该商品,但装了也不一定达到当前最优价值,所以在装与不装之间选择最优的一个,即V(i,j)=max{V(i-1,j),V(i-1,j-w(i))+v(i)}。
  • 其中V(i-1,j)表示不装,V(i-1,j-w(i))+v(i) 表示装了第i个商品,背包容量减少w(i),但价值增加了v(i);换句话说,V(i,j)表示添加前i个物品背包容量为j的最大价值,若第i件物品加入背包,装入这前i件物品获得的最大价值F[i][v],必然等于第i件物品的价值W[i]再加上向容量为v-C[i]的背包装入前i-1件物品这个子问题的最大价值F[i-1][v-C[i]] (先把第i件物品加入背包,然后考虑安排剩余的空间容量)

4、填表,首先初始化边界条件,V(0,j)=V(i,0)=0;V[i,v]是说从前i个物品中挑出物品,将他们放入体积为v的背包可以获得的最大价值。V[0,1…n]. 可以看做是从前0个物品中挑选,放入体积分别为0,1,…,n的背包。f[0,1…n]可以看做是最简化的01背包问题了。

然后一行一行的填表:

  • 如,i=1,j=1,w(1)=2,v(1)=3,有j<w(1),故V(1,1)=V(1-1,1)=0;
  • 又如i=1,j=2,w(1)=2,v(1)=3,有j=w(1),故V(1,2)=max{
    V(1-1,2),V(1-1,2-w(1))+v(1) }=max{0,0+3}=3;

5、输出,表格填完,最优解即V(number,capacity)=V(4,8)=10

回答: LeetCode上的背包问题是指在给定一组物品和一个背包的容量的情况下,选择哪些物品放入背包,使得背包物品的总价值最大。根据物品的选择限制,背包问题可以分为0-1背包问题、完全背包问题和多重背包问题等不同类型。[2] 对于0-1背包问题,每种物品只能选择0个或1个,即要么放入背包,要么不放入。这种情况下,可以使用动态规划来解决,定义一个二维数组dp[i][j]表示前i个物品放入容量为j的背包中所获得的最大价值。通过状态转移方程dp[i][j] = max(dp[i-1][j], dp[i-1][j-weight[i]] + value[i])来更新dp数组,其中weight[i]表示第i个物品的重量,value[i]表示第i个物品价值。最终,dp[n][W]即为所求的最大价值,其中n为物品的个数,W为背包的容量。[3] 完全背包问题是指每种物品可以选择任意个数,即可以重复放入背包。在解决完全背包问题时,可以将其转化为0-1背包问题来求解。具体做法是将每个物品拆分成多个重量和价值相同的物品,然后按照0-1背包问题的方法进行求解。[1] 多重背包问题是指每种物品有一定的数量限制,即每种物品可以选择0个到nums[i]个。对于多重背包问题,可以将其转化为0-1背包问题来求解。具体做法是将每个物品拆分成多个重量和价值相同的物品,然后按照0-1背包问题的方法进行求解。[1] 总结来说,背包问题是在给定一组物品背包容量的情况下,选择合适的物品放入背包,使得背包物品的总价值最大。根据物品的选择限制,背包问题可以分为0-1背包问题、完全背包问题和多重背包问题等不同类型,可以使用动态规划的方法来解决。[2][3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值