zoukankan      html  css  js  c++  java
  • 贪心算法

    贪心算法概念
    贪心算法(又称贪婪算法,因文名:reedy algorithm)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解
     
    贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。

    思想

    贪心算法的基本思路是从问题的某一个初始解出发一步一步地进行,根据某个优化测度,每一步都要确保能获得局部最优解。每一步只考虑一个数据,他的选取应该满足局部优化的条件。若下一个数据和部分最优解连在一起不再是可行解时,就不把该数据添加到部分解中,直到把所有数据枚举完,或者不能再添加算法停止
     
    例题分析
    一、找零问题
    假设商店需要找钱,钱币面额有100,50,20,5,1元,如何找零所需钱币数量最少?
    t = [100,50,20,5,1]

    def change(t,n):
    m = [0 for _ in range(len(t))]
    for i,money in enumerate(t):
    m[i] = n//money
    n = n % money
    return m,n

    print(change(t,376))
     

    二、0-1背包问题

    有一个背包,背包容量是w。有3物品,
    (60价格,10容量),(100,20),(120,30)
    物品不可以分割成任意大小。要求尽可能让装入背包中的物品总价值最大,但不能超过总容量
     

    goods = [(60,10),(100,20),(120,30)] #总价 重量
    goods.sort(key=lambda x:x[0]/x[1],reverse=True) #按均价排序
    print(goods)

    def fractional_backpack(goods,w):
    m = [0 for _ in range(len(goods))] #生成临时列表[0, 0, 0]
    print(m)
    total_v=0 #背包里的价值
    for i,(price,weight)in enumerate(goods):
    if w > weight : #
    m[i] = 1
    total_v += price
    w -= weight
    else:
    m[i] = w / weight
    total_v += m[i]*price
    w=0
    break
    return m

    print(fractional_backpack(goods,50))
     

    三、活动最优方案

    学校的大学生艺术中心周日将面向全校各个学院的学生社团开放,但活动中心同时只能供一个社团活动使用,并且每一个社团活动开始后都不能中断。现在各个社团都提交了他们使用该中心的活动计划(即活动的开始时刻和截止时刻)。请设计一个算法来找到一个最佳的分配序列,以能够在大学生艺术中心安排不冲突的尽可能多的社团活动。

    activities = [(1,4),(3,5),(0,6),(5,7),(3,9),(5,9),(6,10),(8,11),(8,12),(2,14),(12,16)]
    #保证活动是按照结束时间排序的
    activities.sort(key=lambda x : x[1])

    def activity_selection(a):
    res = [a[0]] #取最早结束的活动
    for i in range(1,len(a)):
    if a[i][0]>=res[-1][1] : #当前活动开始时间>上个活动结束时间
    res.append(a[i])

    return res

    print(activity_selection(activities))
              
     
     
     
     
     
  • 相关阅读:
    SQL的case when then else end语句的用法
    PR轨道工具
    Power Bi追加查询
    如何在电商平台查看历史价格
    MYSQL执行SQL出现错误:Error Code:1054.Unknown column "字段名" in 'order clause'如何解决
    Python 的基础数据类型
    整数回文转换
    N-城堡问题
    Find The Multiple
    Ecust DIV3 k进制 【暴力不断优化】
  • 原文地址:https://www.cnblogs.com/sunny666/p/10751594.html
Copyright © 2011-2022 走看看