标签:01 问题 range num path 物品 backage 背包 dp
import numpy as np
def backage_problom(w, v, backage):
num = len(w)
dp = [[0 for _ in range(backage + 1)] for _ in range(num + 1)] # 动态数组维度为(物品个数+1,背包重量+1)
for i in range(1, num + 1):
for j in range(1, backage + 1):
if j < w[i - 1]: # dp数组和w,v的下标要区分对应
dp[i][j] = dp[i - 1][j]
else:
# 前者表示不装第i-1个物品,后者表示装,则价值就是减去第i-1个物品重量的对应dp值加上第i个物品的价值
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i - 1]] + v[i - 1])
dp = np.array(dp)
return dp
def backtrack(w, backage, dp): # 回溯查找背包里的物品
num = len(w)
path = [0 for _ in range(num)] # 物品下标为1-num
while num > 0:
if dp[num][backage] > dp[num - 1][backage]: # 如果dp[i][j]>dp[i-1][j],则表示第i个物品(在w中为第i-1个物品)被放入背包
path[num-1] = 1
backage -= w[num-1]
num -= 1
return path
if __name__ == '__main__':
weights = [2, 2, 6, 5, 4]
values = [6, 3, 5, 4, 6]
backage = 10
res = backage_problom(weights, values, backage)
print('01背包问题最大价值为:',res[-1][-1])
path = backtrack(weights, backage, res)
print('背包里的物品为: ',path)
标签:01,问题,range,num,path,物品,backage,背包,dp 来源: https://blog.csdn.net/ssouthmelon/article/details/121639522
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。