贪心算法及其应用:找零钱问题、求最大公约数问题(Python)

1.贪心算法简介

贪心算法,是用来求解最优化问题的一种方法。一般来说,求解最优化问题的过程就是做一系列决定从而实现最优值的过程。最优解就是实现最优值的这些决定。贪心算法考虑局部最优,每次都做当前看起来最优的决定,得到的解不一定是全局最优解,但是有些问题能够用贪心算法求得最优解。

2.贪心算法应用之一:找零钱

假设有4种硬币,它们的面值分别为2角5分、1角、5分和1分。现在要找给某顾客六角三分钱。问怎样找零钱才能使给顾客的硬币个数最少?

一般来说,我们会拿出2个2角5分的硬币,1个1角的硬币和3个1分的硬币交给顾客,共找给顾客6枚硬币。

这种找零钱的基本思想是:每次都选择面值不超过需要找给顾客的钱的最大面值的硬币。以上面找零钱问题来说:选出一个面值不超过6角3分的最大面值硬币2角5分找给顾客,然后还要找3角8分;选出一个面值不超过3角8分的最大面值硬币2角5分找给顾客,然后还要找1角3分;选出一个面值不超过1角3分的最大面值硬币1角找给顾客,然后还要找3分;选出一个面值不超过3分的最大面值硬币1分找给顾客,然后还要找2分;选出一个面值不超过2分的最大面值硬币1分找给顾客,然后还要找1分;最后选出一个面值不超过1分的最大面值硬币1分找给顾客。这种找硬币的方法实际上就是贪心算法。 

#<程序:找零钱_贪心算法>

v=[25,10,5,1]
n=[0,0,0,0]

def change():
    
    T_str=input('要找给顾客的零钱,单位:分:')
    T=int(T_str)

    greedy(T)

    for i in range(len(v)):
        print('要找给顾客',v[i],'分的硬币:',n[i])
    s=0
    for i in n:
        s=s+i
    print('找给顾客的硬币数最少为:',s)

def greedy(T):
    
    if T==0:
        return
    
    elif T>=v[0]:
        T=T-v[0]; n[0]=n[0]+1
        greedy(T)
        
    elif v[0]>T>=v[1]:
        T=T-v[1]; n[1]=n[1]+1
        greedy(T)
        
    elif v[1]>T>=v[2]:
        T=T-v[2]; n[2]=n[2]+1
        greedy(T)
        
    else:
        T=T-v[3]; n[3]=n[3]+1
        greedy(T)
        
if(__name__=="__main__"):
    change()

3.应用之二:求最大公约数

最大公约数是指两个或多个整数共有约数中最大的一个。用贪心的思想解GCD的基本思想:用较大值尽可能多的减去较小值,使最后的差是小于较小值的非负整数。

#<程序:GCD_贪心算法>

def main():
    x_str=input('请输入正整数x的值:')
    x=int(x_str)
    
    y_str=input('请输入正整数y的值:')
    y=int(y_str)
    
    print(x,'和',y,'的最大公约数是:', GCD(x,y))
    
def GCD(x,y):
    if x>y:
        a=x
        b=y
    else:
        a=y
        b=x
        
    if a%b ==0:
        return(b)
    
    return(GCD(a%b,b))


if(__name__=="__main__"):
      main()

4.小结

贪心算法,又被称为贪婪算法,也是用来求解最优化问题的一种方法。一般来说,求解最优化问题的过程就是做一系列决定从而实现最优值的过程。最优解就是实现最优值的这些决定。动态规划考虑全局最优,得到的解一定是最优解。贪心算法是一种在每一步选择中都采取当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法。贪心算法考虑局部最优,每次都做当前看起来最优的决定,得到的解不一定是全局最优解。但是在有最优子结构的问题中,贪心算法能够得到最优解。最优子结构就是局部最优解能决定全局最优解。简单地说,问题能够分解成子问题来解决,子问题的最优解能递推到最终问题的最优解。虽然对于很多问题贪心算法不一定能得到最优解,但是它的效率高,所求得的答案比较接近最优结果。因此,贪心算法可以用作辅助算法或者直接解决一些要求结果不特别精确的问题。

你可能感兴趣的:(基本算法实现)