python实现动态规划求解0-1背包问题

"""
__date__:2022.5.1
__version__: V1.0.0
__description__:请用动态规划算法来求解0-1背包问题,并且用绘图工具plot对迭代过程中的总价值进行曲线绘制。

"""

from pathlib import Path
import matplotlib.pyplot as plt
import  numpy as np
from matplotlib.pyplot import MultipleLocator
plt.rcParams['font.sans-serif'] = ['SimSun']#显示中文,否则生成的图中文字无法显示

num=6 #背包数量
room=6 #背包容量
weight=[1,3,4,2,8,4]#物品重量
value=[2,4,8,3,2,1]#物品价值
result=[[0 for j in range(room+1)] for i in range(num+1)]#range(k)不包含k,需要+1

x=range(0,num*room+1)
y=[0]

for i in range(1,num+1):
    for j in range(1,room+1):
        if j < weight[i-1] or result[i-1][j-weight[i-1]]+value[i-1] <= result[i-1][j]:
            # 放不下或放入背包后价值<=不放
            result[i][j]=result[i-1][j] #价值和前i-1个物品价值一样
        else:
            result[i][j]=result[i-1][j-weight[i-1]]+value[i-1]

        y.append(result[i][j])

plt.rcParams['font.sans-serif'] = ['SimSun']#显示中文,否则生成的图中文字无法显示
plt.title("0-1背包问题的动态规划算法总价值曲线",fontsize = 14)  #图标题,设置字体大小为14
plt.xlabel("迭代次数",fontsize = 14)  #x轴的文本说明,设置字体大小为14
plt.ylabel("总价值",fontsize = 14)  # y轴的文本说明,设置字体大小为14

plt.plot(x,y,label="动态规划算法",linewidth=1,color="red",linestyle="--",marker="^",markersize=4)

xlabel=[0]
for x in range(0,num*room+1):
    xlabel.append(x)
plt.xticks(xlabel) #设定x轴刻度显示为文本
plt.gca().yaxis.set_major_locator(MultipleLocator(1))#设置y轴间隔为1
plt.legend() #加载图例
plt.savefig('0-1背包问题的动态规划算法总价值曲线(191491531).pdf') #保存图片
plt.show() #显示图片



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值