背包问题

假设你是一个小偷,背一个可装4磅东西的背包。可盗窃的商品有如下3件:

  1. 音响,4磅,价值3000美元
  2. 笔记本电脑,3磅,价值2000美元
  3. 吉他,1磅,价值1500美元
    为了让盗窃的商品价值最高,你该选择哪些商品?

思路:

《算法图解》第9章动态规划

代码:

  1. w=[0,4,3,1]. #商品的重量列表,w[0]占位用
  2. p=[0,3000,2000,1500] #价值列表,p[0]无用
  3. n=len(w)-1 #计算物体的个数
  4. m=4 #背包的最大载重量
  5. optp=[[0 for col in range(m+1)] for raw in range(n+1)]
  6. #optp 相当于创建了一个n*m的全零矩阵,n行为物件,m列为子背包载重量。
  7. def solution(w,p,m):
  8. n=len(w)-1
  9. for i in range(1,n+1):
  10. for j in range(1,m+1):
  11. if j>=w[i]:
  12. optp[i][j]=max(optp[i-1][j],p[i]+optp[i-1][j-w[i]]
  13. else:
  14. optp[i][j]=optp[i-1][j]
  15. #下面这段代码是为了求出盗窃的商品价值最高时的商品组合x。
  16. j=m
  17. x=[]
  18. for i in range(n,0,-1):
  19. if optp[i][j]>optp[i-1][j]:
  20. x.append(i)
  21. j=j-w[i]
  22. return optp[n][m],x

cpu双核问题

网易笔试:一种CPU的两个核能够同时处理任务,现在有n个已知数据量的任务需要交给cpu处理,假设已知CPU的每个核1秒可以处理1kb,每个核同时只能处理一项任务。n个任务可以按照任意顺序放入cpu进行处理,现在需要设计一个方案让CPU处理完这批任务所需时间最少,求这个最小时间。
输入包括2行:
第一行为整数n(1<=n<=50)
第二行为n个整数lengthi单位时b,每个数均为1024的倍数。
输出一个整数,表示最少需要处理的时间。

思路

问题实质是动态规划问题,把数组分成2部分,使得2部分的和相差最小。差值最小就是说2部分的和最接近,而且各部分的和与总和的一半也是最接近。假设用sum1表示第一部分的和,sum2表示第二部分的和,sum表示所有数的和,那么sum1+sum2=sum。假设sum1<sum2,那么sum/2-sum1=sum2-sum/2.所以我们就有目标了,使得sum1<=sum/2的条件下尽可能大。也就是说从n个数中选出某些数,使得这些数尽可能的接近或等于sum1.
抽象为背包问题:
背包的最大载重量(即一个核运行的最长时间):sum//2+1
商品的价值与重量相等,都为length[i]
问题就变成在一个核运行的最长时间内运行价值最大的任务数。

代码

  1. w=[0,3072,3072,7168,3072,1024] #重量
  2. w=list(map(lambda x:x//1024,w)) #转化成kb
  3. p=w #价值
  4. n=sum(w)//2+1
  5. optp=[[0 for j in range(n+1)] for i in range(len(w))]
  6. for i in range(1,len(p)):
  7. for j in range(1,n+1):
  8. if j >= p[i]:
  9. optp[i][j]=max(optp[i-1][j],p[i]+optp[i-1][j-w[i])
  10. else:
  11. optp[i][j]=optp[i-1][j]
  12. return optp[-1][-1]

LIS问题

最长上升子序列

代码

  1. lis=[2,1,5,3,6,4,8,9,7]
  2. d=[1]*len(lis)
  3. res=1
  4. for i in range(len(lis)):
  5. for j in range(i):
  6. if lis[j]<=lis[i] and d[i]<d[j]+1:
  7. d[i]=d[j]+1
  8. if d[j]>res:
  9. res=d[j]
  10. return res

LCS问题

最长公共子序列

代码

  1. s1=[1,3,4,5,6,7,7,8]
  2. s2=[3,5,7,4,8,6,7,8,2]
  3. d=[[0]*(len(s2)+1) for i in range(len(s1)+1)]
  4. for i in range(1,len(s1)+1):
  5. for j in range(1,len(s2)+1):
  6. if s1[i-1]==s2[j-1]:
  7. d[i][j]=d[i-1][j-1]+1
  8. else:
  9. d[i][j]=max(d[i-1][j],d[i][j-1])
  10. return d[-1][-1]

最长公共子串问题

代码

  1. s1=[1,3,4,5,6,7,7,8]
  2. s2=[3,5,7,4,8,6,7,8,2]
  3. d=[[0]*(len(s2)+1) for i in range(len(s1)+1)]
  4. res=0
  5. for i in range(1,len(s1)+1):
  6. for j in range(1,len(s2)+1):
  7. if s1[i-1]==s2[j-1]:
  8. d[i][j]=d[i-1][j-1]+1
  9. res=max(d[i][j],res)
  10. else:
  11. d[i][j]=0
  12. return res

Python 动态规划算法的更多相关文章

  1. python常用算法(7)——动态规划,回溯法

    引言:从斐波那契数列看动态规划 斐波那契数列:Fn = Fn-1 + Fn-2    ( n = 1,2     fib(1) = fib(2) = 1) 练习:使用递归和非递归的方法来求解斐波那契数 ...

  2. Python基础算法综合:加减乘除四则运算方法

    #!usr/bin/env python# -*- coding:utf-8 -*-#python的算法加减乘除用符号:+,-,*,/来表示#以下全是python2.x写法,3.x以上请在python ...

  3. 动态规划 算法(DP)

    多阶段决策过程(multistep decision process)是指这样一类特殊的活动过程,过程可以按时间顺序分解成若干个相互联系的阶段,在每一个阶段都需要做出决策,全部过程的决策是一个决策序列 ...

  4. xsank的快餐 » Python simhash算法解决字符串相似问题

    xsank的快餐 » Python simhash算法解决字符串相似问题 Python simhash算法解决字符串相似问题

  5. 剑指Offer——动态规划算法

    剑指Offer--动态规划算法 什么是动态规划? 和分治法一样,动态规划(dynamic programming)是通过组合子问题而解决整个问题的解. 分治法是将问题划分成一些独立的子问题,递归地求解 ...

  6. 多线程动态规划算法求解TSP(Traveling Salesman Problem) 并附C语言实现例程

    TSP问题描述: 旅行商问题,即TSP问题(Travelling Salesman Problem)又译为旅行推销员问题.货郎担问题,是数学领域中著名问题之一.假设有一个旅行商人要拜访n个城市,他必须 ...

  7. 以计算斐波那契数列为例说说动态规划算法(Dynamic Programming Algorithm Overlapping subproblems Optimal substructure Memoization Tabulation)

    动态规划(Dynamic Programming)是求解决策过程(decision process)最优化的数学方法.它的名字和动态没有关系,是Richard Bellman为了唬人而取的. 动态规划 ...

  8. 五大常用算法之二:动态规划算法(DP)

    一.基本概念 动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移.一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划. 二.基本思想与策略 基本 ...

  9. python聚类算法实战详细笔记 (python3.6+(win10、Linux))

    python聚类算法实战详细笔记 (python3.6+(win10.Linux)) 一.基本概念:     1.计算TF-DIF TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库 ...

随机推荐

  1. 44、[源码]-Spring容器创建-BeanFactory预准备

    44.[源码]-Spring容器创建-BeanFactory预准备 @Override public void refresh() throws BeansException, IllegalStat ...

  2. JavaScript是如何工作的02:深入V8引擎&编写优化代码的5个技巧

    概述 JavaScript引擎是执行 JavaScript 代码的程序或解释器.JavaScript引擎可以实现为标准解释器,或者以某种形式将JavaScript编译为字节码的即时编译器. 以为实现J ...

  3. MySQL高级 之 explain执行计划详解(转)

    使用explain关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的,分析你的查询语句或是表结构的性能瓶颈. explain执行计划包含的信息 其中最重要的字段为:i ...

  4. 利用亚马逊AWS搭建个人服务器

    转载博客地址:https://www.jianshu.com/p/a045d4217175

  5. NetworkX系列教程(10)-算法之五:广度优先与深度优先

    小书匠Graph图论 重头戏部分来了,写到这里我感觉得仔细认真点了,可能在NetworkX中,实现某些算法就一句话的事,但是这个算法是做什么的,用在什么地方,原理是怎么样的,不清除,所以,我决定先把图 ...

  6. shell 边边角角

    [Shell学习笔记] 数组.关联数组和别名使用 Linux中bash脚本数组和字典使用举例 Linux Shell 通配符.元字符.转义符使用实例介绍

  7. 微信小程序环境下将文件上传到 OSS

    步骤 1: 配置 Bucket 跨域 客户端进行表单直传到 OSS 时,会从浏览器向 OSS 发送带有 Origin 的请求消息.OSS 对带有 Origin 头的请求消息会进行跨域规则(CORS)的 ...

  8. mysql IFNULL函数和COALESCE函数使用技巧

    IFNULL() 函数      IFNULL() 函数用于判断第一个表达式是否为 NULL,如果为 NULL 则返回第二个参数的值,如果不为 NULL 则返回第一个参数的值. IFNULL() 函数 ...

  9. TCP HTTP SOCKET之间的有什么关系

    网络由下往上分为 物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 通过初步的了解,我知道IP协议对应于网络层,TCP协议对应于传输层,而HTTP协议对应于应用层, 三者从本质上来说没有可 ...

  10. 2018-2019-2 20165234 《网络对抗技术》 Exp9 Web安全基础

    Exp9 Web安全基础 一. 实践内容 1. 安装JDK.Webgoat 2. SQL注入攻击 数字型注入(Numeric SQL Injection) 日志欺骗(Log Spoofing) 字符串 ...