python实现0-1背包算法

# -*- coding:utf-8 -*- 
"""
问题描述:
有N件物品和一个容量为W的背包。第i件物品的重量为w[i],价值为v[i]。求在装入物品不超过背包容量的前提下,背包中物品最			      
大价值是多少。
解题思路:
构造二位数组result[i][j]表示当背包容量为j,选择前i件物品的最大价值。那么result[i][j]=max(result[i-1][j],result[i][j-
weight[i]]+value[i])。result[i-1][j]表示不选择i的最大价值,result[i][j-weight[i]]+value[i]选择i的最大价值。
"""
import random
total_weight = 200
weight = [random.randint(1,100) for _ in range(10)]
value = [random.randint(1,100) for _ in range(10)]
print("weight = {}".format(weight))
print("value = {}".format(value))

def get_max_value(total_weight, weight, value):
	# 初始化
	result = []
	for _ in range(len(value) + 1):
		result.append([0 for _ in range(total_weight+1)])
	
	# 求最大价值
	for i in range(len(value)):
	 	for j in range(1, total_weight + 1):
	 		if weight[i] <=j:
	 			result[i+1][j] = max(result[i][j], result[i][j-weight[i]]+value[i])
	 		else:
	 			result[i+1][j] = result[i][j]
	
	# 求选择物品
	v = [0 for _ in range(len(value))]
	w = total_weight
	for i in range(len(value) -1, -1, -1):
		if result[i+1][w] == result[i][w]:
			v[i] = 0
		else:
			v[i] = 1
			w = w - weight[i]
	
	print("选择的物品是: {}".format(v))
	print("最大价值: {}".format(result[len(value)][total_weight]))

if  __name__ == "__main__":
	get_max_value(total_weight, weight, value)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值