背包问题解析(一)-贪心算法

一、题目:
有N件物品和一个容量为V的背包。第i件物品的重量是w[i],价值是v[i]。求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和最大。
 
二、解决思路:
本题刚开始的解题的时候,想采取贪心算法来解决,也就是将放入的物品的性价比按照从高到低进行排序,然后优先放优先级高的,其次优先级低的。
 
三、代码实现(python)
 1 # 重量w=[5,4,3,2]
 2 # 价值v=[6,5,4,3]
 3 b=[]
 4 m=int(input("请输入背包的最大重量:"))
 5 n=int(input("请输入商品的数量:"))
 6 for i in range(n):
 7 a=input("请分别输入重量和价值,以空格隔开:")
 8 a=a.split(" ")
 9 for i in range(len(a)):
10 a[i]=int(a[i])
11 b.append(a)
12 print("加载初始化:",b)
13 for i in range(len(b)):
14 for j in range(i+1,len(b)):
15 if b[i][1]/b[i][0]<b[j][1]/b[j][0]:
16 b[i],b[j]=b[j],b[i]
17 print("性价比排序:",b)
18 v=0
19 c=[]
20 for i in range(len(b)):
21 if m-b[i][0]>0:
22 m=m-b[i][0]
23 c.append(b[i])
24 v+=b[i][1]
25 print("放入背包:",c)
26 print("最大价值为:",v)
打印结果:
 
四、算法分析:
贪心选择是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。贪心选择是采用从顶向下、以迭代的方法做出相继选择,每做一次贪心选择就将所求问题简化为一个规模更小的子问题。当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。一般是一维问题。
很明显,此算法在背包问题上面解答是错误的,放入[[2,3],[3,4],[5,6]]时可达到最高值13

 并没有找到最优解,推荐的算法为动态背包算法。

原文地址:https://www.cnblogs.com/mrwhite2020/p/13096948.html