动态规划01背包

本文详细介绍了01背包问题,包括问题简介、状态转移方程详解、举例及动态规划的实现。01背包问题是在给定物品重量和价值的情况下,确定如何装入背包以最大化价值。状态方程为c[i,j] = max{ c[i-1,j-w[i]]+p[i]( j >= w[i] ), c[i-1,j] }。文章通过实例解析了动态规划算法的应用,并提供了代码实现。" 138844954,9247363,解决Anaconda OpenSSL不可用错误,"['网络协议', '网络', 'Anaconda', '环境配置']

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

目录

  1. 01背包问题简介
  2. 详细说明
  3. 状态转移方程详解
  4. 举例
  5. 代码块
  6. 测试结果

01背包问题简介

0-1背包问题:给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。问:应该如何选择装入背包的物品,使得装入背包中的物品的总价值最大?
在选择装入背包的物品时,对每种物品i只有两种选择,即装入背包或不装入背包。不能将物品i装入背包多次,也不能只装入部分的物品i。因此,该问题称为0-1背包问题。


详细说明

01背包的状态转换方程 c[i,j] = max{ c[i-1,j-w[i]]+p[i]( j >= w[i] ), c[i-1,j] }
c[i,j]表示在前i件物品中选择若干件放在承重为 j 的背包中,可以取得的最大价值。


问题分析:令c(i,j)表示在前i(1<=i<=n)个物品中能够装入容量为就j(1<=j<=C)的背包中的物品的最大价值,则可以得到如下的动态规划函数:

(1)

  1. c(i,0)=c(0,j)=0

(2)

  1. c(i,j)=c(i-1,j) (j小于wi)
  2. c(i,j)=max{c(i-1,j) ,c(i-1,j-wi)+pi) } ( j>wi)

(1)式表明:如果第i个物品的重量大于背包的容量,则装入前i个物品得到的最大价值和装入前i-1个物品得到的最大价都是相同的,即物品i不能装入背包。c(i,0)=c(0,j)=0表示第i个物体装入容量为0的背包或者第0个物体装入容量为j的背包的价值都是0
(2)式表明,如果第i个物品的质量小于背包的容量,则会有一下两种情况:

(a). 如果把i个物品装入背包,则背包物品的价值等于第i-1个物品装入容量为j-wi的背包中的价值加上第i个物品的价值p。

(b).如果第i个物品没有装入背包,则背包中物品的价值就等于把前i-1个物品装入容量为j放入背包中所取得的价值。显然取2者中价值最大的作为前i个物品物品装入容量为j放入背包中的最优值。


状态方程详解

由表达式中各个符号的具体含义可得:

w[i]:第i个物体的重量

p[i]:第i个物体的价值

c[i][j]:第i个物体放入容量为j的背包的最大价值

c[i-1][j]:前i-1个物体放入容量为j的背包的最大价值

c[i-1][m-w[i]]:前i-1个物体放入容量为m-w[i]的背包的最大价值

因此状态方程:c[i][j]= max{c[i-1][j],c[i-1][j-w[i]]+p[i]}
解释:第一种是第i件放不进去,这时所得价值为c[i-1][j];第二种是第i件放进去,这时所得价值为c[i-1][j-w[i]](第二种是什么意思?就是如果第i件放进去,那么容量j-w[i]里就要放

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值