背包问题

假设你是一个小偷,背一个可装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. RabbitMQ持久化和非持久化

    但是,非持久化要比持久化速度更快. 队列是否需要持久化:看需求

  2. CSS3 backface-visibility 不面向屏幕是否可见

    backface-visibility 属性定义当元素不面向屏幕时是否可见. 如果在旋转元素不希望看到其背面时,该属性很有用. backface-visibility: visible|hidden; ...

  3. \ddd和\xddd 转义序列

    转自 http://blog.csdn.net/todd911/article/details/8851475 书中有如下描述: \ddd  ddd表示1~3个八进制数字,这个转义符表示的字符就是给定 ...

  4. 一些scala的操作

    Scala获取当前目录下所有文件 import java.io.File //获取目录下的所有文件,当前项目目录输入new File(".") def getFiles1(dir: ...

  5. 详解DLX及其应用

    什么是DLX? 让我们看看百度百科上的解释:在 计算机科学 中, Dancing Links ,舞蹈链, 也叫 DLX, 是由 Donald Knuth 提出的数据结构,目的是快速实现他的 X算法.X ...

  6. mac下生成keystore

    keytool -genkey -v -keystore sign.keystore -alias cxa -keyalg RSA -validity 20000 -keystore /Users/c ...

  7. EXCEL公式中如何表示回车符?

    问题: 将 id credttm cdno cdamt cashbrid cashrole note 转换为 "id  credttm  cdno   cdamt  cashbrid  ca ...

  8. docker安装hbase

    .下载安装Hbase: ().docker search hbase : 查找Hbase ().docker pull harisekhon/hbase:1.3 注意:不要安装最新版本的,不稳定 (我 ...

  9. LeetCode 209. 长度最小的子数组(Minimum Size Subarray Sum)

    题目描述 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组.如果不存在符合条件的连续子数组,返回 0. 示例: 输入: s = 7, nums ...

  10. cross socket和msgpack的数据序列和还原

    cross socket和msgpack的数据序列和还原 procedure TForm1.Button1Click(Sender: TObject); begin var pack: TSimple ...