首页 > 其他分享 >动态规划

动态规划

时间:2024-05-21 15:08:52浏览次数:23  
标签:right int max times 背包 动态 规划 left

DP常见考虑角度

状态表示

以0/1背包问题为例:

  • 所求解问题用几维变量表示。
    • 常见的两维: $ f_{i,j} $ 。
  • 两个考虑角度:集合+属性
    • 表示的集合是什么: 所有选法的集合。
      • 条件:只从前 \(i\) 个物品里面选,总体积 \(\leqslant j\) 。
    • 集合的属性是什么: 最大值、最小值、元素数量
  • \(f_{i,j}\) 表示:从前 \(i\) 个物品中选,所有选法集合里面,总体积 \(\leqslant j\) 的最大价值,答案所求即为 \(f_{N,V}\) 。

状态计算

  • 对应集合的划分
  • 把当前集合划分成若干的更小的子集,使得每一个子集都可以由前面更小的集合算出来。
    • 举例背包问题: 不包含物品 \(i\) or 包含物品 \(i\) 。

DP优化

  • 对状态方程做等价变形。

DP时间复杂度

状态数量\(\times\)求每一个状态所花的时间。

背包问题

背包总体积为 \(V\) 。总共有 \(N\) 件物品,每个物品所占体积为 \(v_i\) ,价值为 \(w_i\)。

01背包

每件物品最多使用一次。

$$f_{i,j} = max\left (f_{i-1,j} ,f_{i-1,j-v_i} + w_i \right ) $$.

for (int i=1;i<=N;i++){
    for (int j=1;j<=V;j++){
        f[i][j]=f[i-1][j];
        if (j>=v[i]) f[i][j]=max(f[i-1][j],f[i-1][j-v[i]]+w[i]);
    }
}

空间复杂度降到一维,\(O \left( V \right)\):

for (int i=1;i<=N;i++){
    for (int j=V;j>=v[i];j--){
        f[j] = max(f[j],f[j-v[i]]+w[i]);
    }
}

注意 \(f_j\)什么时候代表 \(f_{i,j}\) , 什么时候降到 \(f_{i-1,j}\)。

完全背包

每件物品都有无限个。

$$f_{i,j} = max\left (f_{i-1,j} ,f_{i-1,j-k \times v_i} + k \times w_i \right ) , k \times v_i \leqslant j$$.

for (int i=1;i<=N;i++){
    for (int j=0;j<=V;j++){
        for (int k=0;k*v[i]<=j;k++){
            f[i][j] = max(f[i][j],f[i-1][j-k*v[i]]+k*w[i]);
        }
    }
}

优化思路:
时间复杂度优化到二维,\(O \left( NV \right)\):
\( f_{i,j} = max\left (f_{i-1,j} ,f_{i-1,j-v_i} + w_i , f_{i-1,j-2 \times v_i} + 2 \times w_i ,...f_{i-1,j-k \times v_i} + k \times w_i\right) \)
\( f_{i,j-v_i} = max\left ( \quad \quad f_{i-1,j-v_i} ,f_{i-1,j-2 \times v_i} + w_i , f_{i-1,j-3 \times v_i} + 2 \times w_i ,...,f_{i-1,j-k \times v_i} + k-1 \times w_i\right) \)
因此:
$$f_{i,j} = max\left (f_{i-1,j} ,f_{i,j-v_i}+w_i \right ) $$.

for (int i=1;i<=N;i++){
    for (int j=1;j<=V;j++){
        f[i][j]=f[i-1][j];
        if (j>=v[i]) f[i][j]=max(f[i-1][j],f[i][j-v[i]]+w[i]);
    }
}

空间复杂度降到一维,\(O \left( V \right)\):

for (int i=1;i<=N;i++){
    for (int j=v[i];j<=V;j++){
        f[j]=max(f[j],f[j-v[i]]+w[i]);
    }
}

多重背包

每件物品最多使用 \(s_i\) 个。
$$f_{i,j} = max\left (f_{i-1,j} ,f_{i-1,j-k \times v_i} + k \times w_i \right ) , k \leqslant s_i , k \times v_i \leqslant j$$.

for (int i=1;i<=N;i++){
    for (int j=0;j<=V;j++){
        for (int k=0;k*v[i]<=j && k<=s[i];k++){
            f[i][j] = max(f[i][j],f[i-1][j-k*v[i]]+k*w[i]);
        }
    }
}

多重背包问题的优化

二进制优化枚举\(0-s_i\),时间复杂度降到 \(O \left( NVlogS \right)\)。

分组背包问题

有多组物品,每一组物品里面最多选一个。

线性DP

区间DP

标签:right,int,max,times,背包,动态,规划,left
From: https://www.cnblogs.com/albuszhou/p/18204077

相关文章

  • UE4 动态生成网格
    说明在游戏中动态改变网格数量和形状等,该功能是寻路功能的前期准备,即在基础移动地基上方,构建一层网格,任何移动的操作都可以基于该网格进行计算。从而在编辑器模式下能够更方便进行调试InstancedStaticMeshComponent其是一种用于优化静态网格渲染性能的技术。InstancedStaticMes......
  • 新浪微博动态 RSA 分析图文+登录
    当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解新浪微博动态RSA分析图文+登录日期:2016-10-12阿珏教程浏览:3583次评论:5条新浪微博动态RSA分析一、用到的工具......
  • cmake配置项目引用动态库
    note#本文将介绍使用FIND_PACKAGE配置项目动态库的方法cmakeversion:3.18platform:win1020H2概述#创建了一个动态库,再由主项目调用该动态库。find<lib库名>.cmake的内容是:1.定义动态库的头文件所在路径2.定义库所在路径写好cmake文件后,也可以方便给其他人调用,省......
  • GoF之代理模式(静态代理+动态代理(JDK动态代理+CGLIB动态代理带有一步一步详细步骤))
    1.GoF之代理模式(静态代理+动态代理(JDK动态代理+CGLIB动态代理带有一步一步详细步骤))@目录1.GoF之代理模式(静态代理+动态代理(JDK动态代理+CGLIB动态代理带有一步一步详细步骤))每博一文案2.代理模式的理解3.静态代理4.动态代理4.1JDK动态代理4.1.1JDK动态代理中(获取到目......
  • 【uniapp 篇 】动态添加 表单,所添加元素展示在同一行
    动态添加表单,所添加元素展示在同一行1<uni-formslabelWidth="68px">23<uni-forms-itemv-for="(item,index)inbaseFormData.dynamicTable.timeField.array"4......
  • delphi安卓动态权限申请
    delphi安卓动态权限申请安卓8及以上版本,除了原来的静态权限申请以外,还需要动态权限申请。delphi10.3开始支持安卓动态权限申请。delphi11开始官方改变了安卓动态权限申请的参数类型,导致原来编写的代码,编码报错。下面的代码,可以很好地解决权限问题。兼顾了delphi10.3和delphi11......
  • [动态规划] 区间 dp
    区间dp石子合并将区间长度\(len\)作为\(dp\)的阶段设\(f[l][r]\)表示把最初的第\(l\)堆到第\(r\)堆石子合并成一堆,需要消耗的最少体力。合并代价就是这两堆石子的质量和,这里可以用前缀和直接计算,设\(s[i]\)表示前\(i\)堆石子的质量和。状态转移方程:\[f[l][r]......
  • vue3+vite,写动态路由时候遇到的坑
    import导入一直报错,看了网上说import不行要写成 require之类的,都试了个遍,结果还是不行。一个很容易犯的错误:理所当然的以为alias是可以使用的。事实上写全相对路径就可以了!!! letr=awaitapis['common/getRouteList']()constlist=r.map((t)=>({id:t.id,pid......
  • 动态排序
    usingDynamicSort;usingMicrosoft.EntityFrameworkCore;List<StudnetEntity>studentList=newList<StudnetEntity>(){newStudnetEntity(){Name="Chen",Age=28},newStudnetEntity(){Name="Wang",Age=29}};......
  • 关于IDEA使用xml实现动态sql的问题
     如上图,我在mapper层编写了一个list方法用于实现动态sql。1.导入使用xml文件的mybatis依赖。 2.配置文件的修改.properties .yml mybatis.mapper-locations=classpath:mapper/*.xml:这个配置项指定了MyBatis映射器XML文件的位置。值classpath:mapper/*.xml......