0-1 背包问题

0-1背包问题:

如果给定一个集合s={1,2,3…,n},物品i的重量是w(i),其价值是v(i),背包的容量为W,即在最大载重量不超过W。在限定的总重量W内,如何选择物品使得物品的总价值最大?这类问题就是背包问题

解决方法:

我们先来做个整理,比如有4个数a1,a2,a3,a4,我们要找出4个数里面在不超过重量的情况下,价值最大。进一步在分析对于这个数合适我就装,不合适我就不要装,这样最后一个数a4情况下有这4种情况并满足下列等式:
在这里插入图片描述

提示:拿出笔记本记下下面公式

p(i,j)有两种情况是这个物品 i 放和不放的情况,

如果不放,则满足p(i,j)=p(i+1,j)此时 0<=j<w(i);

当放的时候,则满足p(i,j)=max( p(i+1,j) , p(i+1,j-w(i))+v(i) ) 此时 j>=w(i)

在j>=w(n)情况下 , p(n,j) = v(n)
在0<=j<w(n)情况下,p(n,j) = 0

在这个公式中p(i,j)就是背包容量为 j,可选物品为 i,
p(n,j)就是 n 这个物品的价值装不下就是 0,装得下就是v(n)


算法实现:(Python)

def beibao(lis1,lis2,n):
	# 重量w 2  1   3   2
	# 价值v 12 10  20  15
	# 背包容量为5 上面是4个物品
	lis=[[0 for i in range(n+1) ]for j in range(len(lis1))]
	for i in range(len(lis1)):
		for j in range(1,n+1):
			if i ==0:
				if j>=lis1[i]:
					lis[i][j]=lis2[i]
			else:
				if j < lis1[i]:
					lis[i][j]=lis[i-1][j]
				else:
					lis[i][j]=max([lis2[i],lis[i-1][j-lis1[i]]+lis2[i],lis[i-1][j]])
	return lis
print(beibao([2,3,1,2],[15,20,10,12],5))

在这里插入图片描述
人生苦短,我用python。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱吃鱼人士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值