array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 偷东西的学问-背包问题 - 爱码网
gongyanzh

背包问题(0-1背包问题)

假设你是个小偷,背着一个可装 4 磅东西的背包。 你可盗窃的商品有如下3件(摘自算法图解):

image-20200513145644729

作为一名优秀的小偷,为了让盗窃的商品价值最高,该选择哪些商品呢?

很明显,小偷需要在满足背包容量要求下,选择价值总和最大的。

使用动态规划

先解决小背包(子背包)问题,再逐步解决原来的问题

image-20200513145630444
  • 状态转移

    cell[i][j]表示前i种物品恰放入一个容量为j的背包能获得的最大价值

    image-20200513150226229

\[cell[i][j] = max(cell[i-1][j],v[i]*k_i+cell[i-1][j-k_i*w[i]]),k \in \{0,1\} \]

coding

def knapsack(goods,volume):
    dp = [[0]*(volume+1) for _ in range(len(goods))]
    
    for j in range(1,volume+1):#初始化
        if goods[0][1] <= j:
            dp[0][j] = goods[0][0]

    for i in range(1,len(goods)):
        for j in range(1,volume+1):
            if goods[i][1] <= j:
                dp[i][j] = max(dp[i-1][j],goods[i][0]+dp[i-1][j-goods[i][1]])
            else:
                dp[i][j] = dp[i-1][j]
    return dp

goods = [[1500,1],[2000,3],[3000,4]]#价值 重量
volume = 4 
knapsack(goods,volume)

结果

image-20200513153518801


image-20200513154016981

将吉他和笔记本电脑装入背包时价值最高,为3500美元。

在刚才的盗窃活动中,每次可以偷的东西都是一个完整的个体,对每个物品要么选择偷,要么不偷,所以称为 0-1背包问题

可以偷商品的一部分吗(完全背包问题)

假如你在杂货店行窃,可偷成袋的扁豆和大米,但如果整袋装不下,可打开包装,再将背包 倒满。在这种情况下,不再是要么偷要么不偷,而是可偷商品的一部分。如何使用动态规划来处 理这种情形呢?

假设有如下商品(每种商品无限多)可供选择。

image-20200513171140832

略作思索,小偷发现在决定偷哪些东西时, 动态规划 是一个不错的方法,因为:

从每种物品i 偷/不偷 (\(k_i \in \{0,1\}\))变为 偷多少单位 (\(k_i\in \{0,1,2,...,W/w_i\}\)),背包总容量 W,第i类物品占 \(w_i\) 的空间。

  • 状态转移

    image-20200513172830899

    \[cell[i][j] = max(cell[i-1][j],v[i]*k_i+cell[i-1][j-k_i*w[i]])\\k_i\in \{0,1,2,...,W/w_i\} \]

coding

def knapsack(w,v,volume):
    dp = [[0]*(volume+1) for _ in range(len(w))]
    
    for j in range(1,volume+1):
        for k in range(j//w[0]+1):
            dp[0][j] = max(dp[0][j],v[0]*k)

    for i in range(1,len(w)):
        for j in range(1,volume+1):
            temp = 0
            for k in range(j//w[i]+1):
                temp = max(temp,v[i]*k+dp[i-1][j-k*w[i]])
            dp[i][j] = max(dp[i-1][j],temp)
    return dp

weight = [2,1,3] #重量
value = [5,2,4]#价值 
volume = 7

knapsack(weight,value,volume)

结果

image-20200513182126844

物以稀为贵(多重背包问题)

由于燕麦的营养价值比较高,但是只有一点点,可偷的商品受到了限制

image-20200513182535086

每种商品只有部分可供选择 \(k_i<M_i\),但问题还是

偷多少单位 (\(k_i\in \{0,1,2,...,W/w_i\}\)),背包总容量 W,第i类物品占 \(w_i\) 的空间。

多重背包问题 相比 完全背包问题多了限制条件,即可偷物品的数量。

同样使用动态规划

  • 状态转移

    \[cell[i][j] = max(cell[i-1][j],v[i]*k_i+cell[i-1][j-k_i*w[i]])\\k_i\in \{0,1,2,...,W/w_i\},k_i \leq M_i \]

coding

def knapsack(w,v,M,volume):
    dp = [[0]*(volume+1) for _ in range(len(w))]
    
    for j in range(1,volume+1):
        for k in range(min(j//w[0],M[0])+1):#增加限制条件
            dp[0][j] = max(dp[0][j],v[0]*k)

    for i in range(1,len(w)):
        for j in range(1,volume+1):
            temp = 0
            for k in range(min(j//w[i],M[i])+1):#增加限制条件
                temp = max(temp,v[i]*k+dp[i-1][j-k*w[i]])
            dp[i][j] = max(dp[i-1][j],temp)
    return dp

weight = [2,1,3] #重量
value = [5,2,4] #价值 
maxk = [1,3,3] #数量
volume = 7

knapsack(weight,value,maxk,volume)

结果

image-20200513183907161

相关文章: