首页 编程教程正文

面试必会--详解动态规划!!通过python学习一个很难的算法

piaodoo 编程教程 2020-02-22 22:12:30 1092 0 python教程

本文来源吾爱破解论坛

本帖最后由 yx_robert 于 2019-5-23 11:06 编辑

面试大厂做算法题 比如百度,头条,腾讯(北京地区面试我所知道的大厂)
动态算法是其中最难啃的题目之一
正好最近在公司内部做了一次技术分享
也把这些打包给大家
干货代码就直接贴出来了 详解!!!
自己整理的ppt文档啥的也分享给大家
希望大家都能够掌握这个算法
(真的很详细 化难为易 我们组的美术哥们都听懂了- -!)
代码配合ppt食用更佳

[Python] 纯文本查看 复制代码

#! /usr/bin/env python
# -*- coding: UTF-8 -*-

import time

# 1.递归
def func_1(tab, index, num):
        # 边界判断
        if num <= 0 or index >= len(tab):
                return 0

        # 人数不够直接返回
        if tab[index][1] > num:
                return func_1(tab, index + 1, num)

        # 转移方程(核心)
        a = b = 0
        a = func_1(tab, index + 1, num)
        b = func_1(tab, index + 1, num - tab[index][1]) + tab[index][0]
        if a >= b:
                return a
        else:
                return b

# 2.递归优化(备忘录算法解法)
def func_2(tab, index, num, m_record):
        # 边界判断
        if num <= 0 or index >= len(tab):
                return 0

        # 人数不够直接返回
        if tab[index][1] > num:
                return func_2(tab, index + 1, num, m_record)

        # 记录在案 直接返回结果
        if (index, num) in m_record:
                return m_record[(index, num)]

        # 转移方程(核心)
        a = b = 0
        a = func_2(tab, index + 1, num, m_record)
        b = func_2(tab, index + 1, num - tab[index][1], m_record) + tab[index][0]
        if a >= b:
                # 记录某种状态下的最优解
                m_record[(index, num)] = a
                return a
        else:
                # 记录某种状态下的最优解
                m_record[(index, num)] = b
                return b

# 3.动态规划方法
def func_3(tab, index, num):
        print("3.动态规划方法\n")
        # 从0到10人 0是为了方便边界处理
        # 没多一个矿的最优解只和上一层的结果相关
        # 故保留上一层的数据pre_result
        pre_result = [0 for i in range(num + 1)]
        result = [0 for i in range(num + 1)] 
        print(pre_result)

        # 初始化第一行边界 1个矿的情况
        for i in range(num + 1): # [0 -- num)
                if tab[0][1] > i:
                        pre_result[i] = 0
                else:
                        pre_result[i] = tab[0][0]

        print("boarder:")
        print(pre_result)
        print("\n")

        # 外层循环矿的数量
        for i in range(1, len(tab)):
        # for i in range(1, 4):
                # 内层循环人数
                for j in range(num + 1):
                        if j == 0:
                                # 第一列边界
                                result[j] = 0
                        elif j >= tab[i][1]:
                                # 转移方程(核心)
                                a = pre_result[j]
                                b = pre_result[(j - tab[i][1])] + tab[i][0]
                                result[j] = a if a > b else b
                        else:
                                result[j] = pre_result[j]

                # 
                print(result)
                # 记录上一层数据
                for k in range(num + 1):
                        pre_result[k] = result[k]

        return result[num]


# 题目:
# 有一个国家发现了5座金矿,每座金矿的黄金储量不同,需要参与挖掘的工人数也不同。
# 参与挖矿工人的总数是10人。每座金矿要么全挖,要么不挖,不能派出一半人挖取一半金矿。
# 要求用程序求解出,要想得到尽可能多的黄金,应该选择挖取哪几座金矿

# data
worker_num = 10
# 金子数量, 需要人数
tab_gold_mine = [
        [400, 5] ,
        [500, 5] ,
        [200, 3] ,
        [300, 4] ,
        [350, 3] ,
]

def main():

        # start = time.time()
        # print(start)

        # 1.递归
        val = func_1(tab_gold_mine, 0, worker_num)

        # 2.递归优化(备忘录算法解法)
        map_record = {}
        val = func_2(tab_gold_mine, 0, worker_num, map_record)
        # print(map_record)

        # 3.动态规划方法
        val = func_3(tab_gold_mine, 0, worker_num)

        # end = time.time()
        # print(end)
        # print("时间消耗:%f" % (end - start))

        print(val)

if __name__ == "__main__":
        main()


嗨学网

dynamic_programming.rar

2019-5-23 11:03 上传

点击文件名下载附件

下载积分: 吾爱币 -1 CB

357.52 KB, 下载次数: 189, 下载积分: 吾爱币 -1 CB

宣讲文档ppt

版权声明:

本站所有资源均为站长或网友整理自互联网或站长购买自互联网,站长无法分辨资源版权出自何处,所以不承担任何版权以及其他问题带来的法律责任,如有侵权或者其他问题请联系站长删除!站长QQ754403226 谢谢。

有关影视版权:本站只供百度云网盘资源,版权均属于影片公司所有,请在下载后24小时删除,切勿用于商业用途。本站所有资源信息均从互联网搜索而来,本站不对显示的内容承担责任,如您认为本站页面信息侵犯了您的权益,请附上版权证明邮件告知【754403226@qq.com】,在收到邮件后72小时内删除。本文链接:https://www.piaodoo.com/7801.html

搜索