0-1背包相关问题

这篇博客详细介绍了如何使用动态规划算法解决0-1背包问题,包括问题描述、算法原理、过程详解、伪代码展示及具体实例,如零钱兑换、完全平方数和分割等和子集的应用。
摘要由CSDN通过智能技术生成

一、问题描述

有n个物品,每个物品有各自的体积和价值,有一个给定容量的背包。
问:在不超过背包总容量的前提下,如何装物品才能使得背包的总价值最大?

二、动态规划算法原理及其过程

1、原理

动态规划是把大问题拆分成若干子问题,通过寻找大问题与子问题的递推关系,
解决一个个子问题,最终到达解决原问题的效果。
动态规划则通过填写表把所有已经解决的子问题答案记录下来,
在新问题里需要用到的子问题的解可以直接提取,
避免了重复计算,从而节约了时间,所以在问题满足最优性原理之后,
用动态规划解决问题的核心就在于填表,表填写完毕,最优解也就找到。

2、过程

(1)参数定义:
用v[i]表示物品价值,w[i]表示物品重量。定义状态dp[i][j]以j为容量为放入前i个物品(按i从小到大的顺序)的最大价值。

(2)初始化边界条件:
   V(0,j)=V(i,0)=0;无论背包的容量是0,还是物品的价值为0,两个条件满足任意一个,总价值即为0.

(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);

(4)得出递推关系式:
    ① j < w ( i ) j<w(i) j<w(i) 时:
     V ( i , j ) = V ( i − 1 , j ) V(i,j)=V(i-1,j) V(i,j)=V(i1,j)
    ② j ≥ w ( i ) j \geq w(i) jw(i)时:
     V ( i , j ) = m a x { V ( i − 1 , j ) , V ( i − 1 , j − w [ i ] ) + v [ i ] } V(i,j)=max \lbrace V(i-1,j),V(i-1,j-w[i])+v[i]\rbrace V(i,j)=max{ V(i1,j),V(i1,jw[i])+v[i]}

3、例子

n = 4
cpacity = 8

i 1 2 3 4
w(体积) 2 3 4 5
v(价值) 3 4 5 6

图解:
(初始化)

i/j 0 1 2
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值