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() #显示图片



你可能感兴趣的:(python,python,开发语言)