背包问题

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

  1. 音响,4磅,价值3000美元
  2. 笔记本电脑,3磅,价值2000美元
  3. 吉他,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 动态规划算法的更多相关文章

  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. Accounts Merge

    Description Given a list accounts, each element accounts[i] is a list of strings, where the first el ...

  2. git的优点跟缺点?

    优点: 1.分布式开发时,可以git clone克隆一个本地版本,然后在本地进行操作提交,本地可以完成一个完整的版本控制.在发布的时 候,使用git push来推送到远程即可. 2.git分支的本质是 ...

  3. css选择器:first-child与:first-of-type的区别

    :first-child选择器是css2中定义的选择器,从字面意思上来看也很好理解,就是第一个子元素.比如有段代码: <div> <p>第一个子元素</p> < ...

  4. 用python写一个GitHub Trending Api

    GitHub 给了开发者相当丰富的 API 接口 https://developer.github.com/v3/,包括认证,搜索,活动等接口,但就是没有提供获取 Trending 的接口.因此,需要 ...

  5. 零基础Python入门(1)- python安装与预热

    大家好,我是jacky,很高兴跟大家分享<Python数据科学之金融行业实操>,今天带大家学习我们这门课的操作工具,就是Python,为什么选用Python来作为金融行业数据科学的工具呢? ...

  6. 怎么样使用vuex

    https://www.cnblogs.com/songrimin/p/7815850.html

  7. 阿里巴巴高可用技术专家襄玲:压测环境的设计和搭建 PTS - 襄玲 云栖社区 今天

    阿里巴巴高可用技术专家襄玲:压测环境的设计和搭建 PTS - 襄玲 云栖社区 今天

  8. Java 数组元素逆序Reverse的三种方式

    Java 数组元素逆序Reverse的三种方式   本文链接:https://blog.csdn.net/xHibiki/article/details/82930521 题目 代码实现 说明 int ...

  9. Django之数据库对象关系映射

    Django ORM基本配置 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去 ...

  10. 123456---com.twoapp.xiaoxiaozuqiujiang---小小足球将

    com.twoapp.xiaoxiaozuqiujiang---小小足球将