Python 动态规划算法
背包问题
假设你是一个小偷,背一个可装4磅东西的背包。可盗窃的商品有如下3件:
- 音响,4磅,价值3000美元
- 笔记本电脑,3磅,价值2000美元
- 吉他,1磅,价值1500美元
为了让盗窃的商品价值最高,你该选择哪些商品?
思路:
《算法图解》第9章动态规划
代码:
w=[0,4,3,1]. #商品的重量列表,w[0]占位用
p=[0,3000,2000,1500] #价值列表,p[0]无用
n=len(w)-1 #计算物体的个数
m=4 #背包的最大载重量
optp=[[0 for col in range(m+1)] for raw in range(n+1)]
#optp 相当于创建了一个n*m的全零矩阵,n行为物件,m列为子背包载重量。
def solution(w,p,m):
n=len(w)-1
for i in range(1,n+1):
for j in range(1,m+1):
if j>=w[i]:
optp[i][j]=max(optp[i-1][j],p[i]+optp[i-1][j-w[i]]
else:
optp[i][j]=optp[i-1][j]
#下面这段代码是为了求出盗窃的商品价值最高时的商品组合x。
j=m
x=[]
for i in range(n,0,-1):
if optp[i][j]>optp[i-1][j]:
x.append(i)
j=j-w[i]
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]
问题就变成在一个核运行的最长时间内运行价值最大的任务数。
代码
w=[0,3072,3072,7168,3072,1024] #重量
w=list(map(lambda x:x//1024,w)) #转化成kb
p=w #价值
n=sum(w)//2+1
optp=[[0 for j in range(n+1)] for i in range(len(w))]
for i in range(1,len(p)):
for j in range(1,n+1):
if j >= p[i]:
optp[i][j]=max(optp[i-1][j],p[i]+optp[i-1][j-w[i])
else:
optp[i][j]=optp[i-1][j]
return optp[-1][-1]
LIS问题
最长上升子序列
代码
lis=[2,1,5,3,6,4,8,9,7]
d=[1]*len(lis)
res=1
for i in range(len(lis)):
for j in range(i):
if lis[j]<=lis[i] and d[i]<d[j]+1:
d[i]=d[j]+1
if d[j]>res:
res=d[j]
return res
LCS问题
最长公共子序列
代码
s1=[1,3,4,5,6,7,7,8]
s2=[3,5,7,4,8,6,7,8,2]
d=[[0]*(len(s2)+1) for i in range(len(s1)+1)]
for i in range(1,len(s1)+1):
for j in range(1,len(s2)+1):
if s1[i-1]==s2[j-1]:
d[i][j]=d[i-1][j-1]+1
else:
d[i][j]=max(d[i-1][j],d[i][j-1])
return d[-1][-1]
最长公共子串问题
代码
s1=[1,3,4,5,6,7,7,8]
s2=[3,5,7,4,8,6,7,8,2]
d=[[0]*(len(s2)+1) for i in range(len(s1)+1)]
res=0
for i in range(1,len(s1)+1):
for j in range(1,len(s2)+1):
if s1[i-1]==s2[j-1]:
d[i][j]=d[i-1][j-1]+1
res=max(d[i][j],res)
else:
d[i][j]=0
return res
Python 动态规划算法的更多相关文章
- python常用算法(7)——动态规划,回溯法
引言:从斐波那契数列看动态规划 斐波那契数列:Fn = Fn-1 + Fn-2 ( n = 1,2 fib(1) = fib(2) = 1) 练习:使用递归和非递归的方法来求解斐波那契数 ...
- Python基础算法综合:加减乘除四则运算方法
#!usr/bin/env python# -*- coding:utf-8 -*-#python的算法加减乘除用符号:+,-,*,/来表示#以下全是python2.x写法,3.x以上请在python ...
- 动态规划 算法(DP)
多阶段决策过程(multistep decision process)是指这样一类特殊的活动过程,过程可以按时间顺序分解成若干个相互联系的阶段,在每一个阶段都需要做出决策,全部过程的决策是一个决策序列 ...
- xsank的快餐 » Python simhash算法解决字符串相似问题
xsank的快餐 » Python simhash算法解决字符串相似问题 Python simhash算法解决字符串相似问题
- 剑指Offer——动态规划算法
剑指Offer--动态规划算法 什么是动态规划? 和分治法一样,动态规划(dynamic programming)是通过组合子问题而解决整个问题的解. 分治法是将问题划分成一些独立的子问题,递归地求解 ...
- 多线程动态规划算法求解TSP(Traveling Salesman Problem) 并附C语言实现例程
TSP问题描述: 旅行商问题,即TSP问题(Travelling Salesman Problem)又译为旅行推销员问题.货郎担问题,是数学领域中著名问题之一.假设有一个旅行商人要拜访n个城市,他必须 ...
- 以计算斐波那契数列为例说说动态规划算法(Dynamic Programming Algorithm Overlapping subproblems Optimal substructure Memoization Tabulation)
动态规划(Dynamic Programming)是求解决策过程(decision process)最优化的数学方法.它的名字和动态没有关系,是Richard Bellman为了唬人而取的. 动态规划 ...
- 五大常用算法之二:动态规划算法(DP)
一.基本概念 动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移.一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划. 二.基本思想与策略 基本 ...
- python聚类算法实战详细笔记 (python3.6+(win10、Linux))
python聚类算法实战详细笔记 (python3.6+(win10.Linux)) 一.基本概念: 1.计算TF-DIF TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库 ...
随机推荐
- Educational Codeforces Round 75 (Rated for Div. 2) B. Binary Palindromes
链接: https://codeforces.com/contest/1251/problem/B 题意: A palindrome is a string t which reads the sam ...
- Helm:kubernetes应用包管理工具
概要 Helm:kubernetes应用包管理工具 K8s部署应用的时候,应用会通过yaml描述信息调用K8s-api:Helm即是管理这些Yaml的应用包管理工具 组成 Helm包含5个部分 Hel ...
- 第三次作业-MOOC学习笔记:Python网络爬虫与信息提取
1.注册中国大学MOOC 2.选择北京理工大学嵩天老师的<Python网络爬虫与信息提取>MOOC课程 3.学习完成第0周至第4周的课程内容,并完成各周作业 第一周 Requests库的爬 ...
- iwap问题
1. 2. . . ========================================================================================== ...
- uoj #139
树链剖分//模板题由于存在换根操作对所有关于节点 u 的修改和查询操作进行分类讨论若 Root 在 u 的子树中,则不处理 u 所在的 Root 的那颗子树否则不会有影响寻找 Root 所在的那颗子树 ...
- requests记录
http://docs.python-requests.org/zh_CN/latest/user/quickstart.html r = requests.get('http://httpbin.o ...
- windows下安装php性能分析工具XHProf
一.安装扩展 下载XHProf扩展:http://dev.freshsite.pl/php-extensions/xhprof.html 放入扩展文件:下载后解压出.dll文件,拷贝它到php的ext ...
- hadoop 2.x HA 出现ssh不能解析问题记录。
在docker里面安装hadoop HA 在启动或者停止的时候报ssh不能解析问题. 问题现象: 发现图片不清晰:把问题现象粘贴如下: root@master:/usr/local/hadoop-2. ...
- Apache Flink - Window
Window: 在Streaming中,数据是无限且连续的,我们不可能等所有数据都到才进行处理,我们可以来一个就处理一下,但是有时我们需要做一些聚合类的处理,例如:在过去的1分钟内有多少用户点击了我们 ...
- python人生如初见之初见yield
今天学习爬虫Scrapy框架搭建的时候,了解了yield的用法.了解一个东西,无外乎 WHAT? HOW? WHY? WHAT yield英文意思是屈服,退位,放弃.额...其实它是Python中的一 ...