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


    一、题目:
    有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

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

  • 相关阅读:
    ubuntu 9.04更新源
    想学一下asp.net,跟着书本做了个bbs
    [转]ubuntu系统中遇到的一些问题及解决
    第一篇,打个招呼
    人际交往的书籍推荐
    程序员的五层境界,你在哪一层?
    HTTP报文之"请求报文"和"响应报文"详解
    如何提高你的工作效率?
    面对焦虑我们怎么办 ?
    CEO要看的书籍推荐
  • 原文地址:https://www.cnblogs.com/mrwhite2020/p/13096948.html
Copyright © 2020-2023  润新知