(python)背包问题递归算法、动态规划算法比较实验
实验题目
背包问题递归算法、动态规划算法比较实验
问题描述:
给定 n 件物品,物品的重量为 w[i],物品的价值为 v[i]。现挑选物品放入背包中,假定背包能承受的最大重量为 c,问应该如何选择装入背包中的物品,使得装入背包中物品的总价值最大?
实验要求
画出运行时间与n变化曲线对比图,并分析原因
实验目的
1、掌握递归算法与动态规划算法思想。
2、了解什么是01背包问题,并使用递归算法及动态规划算法解决01背包问题。
3、比较递归算法与动态规划算法解决01背包问题不同n值所耗费的时间。
实验步骤
1、递归算法解决01背包问题
#sum:选择前i件物品的价值之和
#now_wight:第i件物品的重量
def rec_bag(sum, now_wight, i, j = 0):
global maxValue
if now_wight > c:#超出重量 则回退
return
if i==n: #已经完成n件物品的选择
if sum > maxValue: #更新最大价值
maxValue = sum
return
rec_bag(sum+v[i], now_wight+w[i],i+1,j = 0)#选这件物品
rec_bag(sum,now_wight,i+1, j = 0) #不选这件物品
2、动态规划算法解决01背包问题
#动态规划解决01背包问题
# n:物品的数量
# c:书包能承受的重量
# w:每个物品的重量
# v:每个物品的价值
def bag(n,c,w,v):
# 置零,表示初始状态
value = [[0 for j in range(c + 1)] for i in range(n + 1)]
for j in range(c+1):
value[0][j]=0
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
3、统计函数运行时间
#函数运算时间
def time_Counter(func,n,c,w,v):
time_start = time.time()
func(n,c,w,v)
time_end = time.time()
return time_end-time_start
4、可视化显示实验结果
def ShowTimes(N,time1, time2):
#设置汉字格式
font = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=14)
plt.figure