01背包(回溯法)

01背包,即只判断物品取舍,让利益最大化
经过老师的讲解,我了解到

n=3, C=30, w={16, 15, 15}, v={45, 25, 25}
开始时,Cr=C=30,V=0,A为唯一活结点,也是当前扩展结点
1.

扩展A,先到达B结点 再扩展B到达E(续) E可行,此时A、B、E是活结点,E成为新的扩展结点 扩展E,先到达J Cr<w3,J导致一个不可行解,回溯到E 再次扩展E到达K 由于K是叶结点,即得到一个可行解x=(1,0,0),V=45
K不可扩展,成为死结点,返回到E E没有可扩展结点,成为死结点,返回到B B没有可扩展结点,成为死结点,返回到A

2.

A再次成为扩展结点,扩展A到达C Cr=30,V=0,活结点为A、C,C为当前扩展结点 扩展C,先到达F
Cr=Cr-w2=15,V=V+v2=25,此时活结点为A、C、F,F成为当前扩展结点 扩展F,先到达L
Cr=Cr-w3=0,V=V+v3=50 L是叶结点,且50>45,皆得到一个可行解x=(0,1,1),V=50
L不可扩展,成为死结点,返回到F 再扩展F到达M M是叶结点,且25<50,不是最优解 M不可扩展,成为死结点,返回到F
F没有可扩展结点,成为死结点,返回到C

3.

再扩展C到达G Cr=30,V=0,活结点为A、C、G,o为当前扩展结点
扩展G,先到达N,N是叶结点,且25<50,不是最优解,又N不可扩展,返回到G
再扩展G到达O,O是叶结点,且0<50,不是最优解,又O不可扩展,返回到G G没有可扩展结点,成为死结点,返回到C
C没有可扩展结点,成为死结点,返回到A A没有可扩展结点,成为死结点,算法结束,最优解X=(0,1,1),最优值V=50

01背包图算法经历大致如图
如下是根据我自行理解写的代码部分

#include<stdio.h>
int n,c,bestv;//物品的个数,背包的容量,最大价值
int v[10000],w[10000],x[
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值