1.实验目的
2.实验内容
2.1 问题描述
给定一组物品,在背包限重内,使放入物品的总价格最高。
2.2 问题分析
对每一件物品遍历背包容量,当背包可容纳值大于等于当前物品时,与之前已放进去的物品所得价值进行对比:
- 如果当前物品价值大于背包中物品价值,进行置换
- 否则不置换
3.实验过程及结果
3.1 数据输入
def getdata():
n = int(input("请输入物品个数:"))
c = int(input("请输入书包的容量:"))
w = []
v= []
for i in range(1, n + 1):
dis1 = int(input("请输入第{}个物品的重量:".format(i)))
w.append(dis1)
dis2 = int(input("请输入第{}个物品的价值:".format(i)))
v.append(dis2)
return n,c,w,v
从键盘输入物品个数,背包容量,物品重量,物品价值。因为如果物品重量大于背包容量则不会装入背包,所以不需加条件限制。
3.2 实验代码
def bag(n, c, w, v):
value = [[0 for j in range(c + 1)] for i in range(n + 1)]
for i in range(1, n + 1):
for j in range(1, c + 1):
value[i][j] = value[i - 1][j]
if j >= w[i - 1] and value[i][j] < value[i - 1][j - w[i - 1]] + v[i - 1]:
value[i][j] = value[i - 1][j - w[i - 1]] + v[i - 1]
return value
def show(n, c, w, value):
print('背包物品最大价值为:', value[n][c])
x = [False for i in range(n)]
j = c
for i in range(n, 0, -1):
if value[i][j] > value[i - 1][j]:
x[i - 1] = True
j -= w[i - 1]
print('装入物品为:')
for i in range(n):
if x[i]:
print('第', i+1, '个,', end='')
回溯法,从尾遍历物品,当value大于上一行同样位置的value时,表示放进该物品