zoukankan      html  css  js  c++  java
  • 动态规划进阶一

    动态规划dp(Dynamic Programming)

    基本思想:是通过类似分治的方法,将一个人问题分解成多个阶段求解,每一个决策都依赖于当前的状态,决策过后问题又发生转移,通过多步转移方式求解的过程就叫做动态规划。

    适用于动态规划的问题应具有的性质:

    (1)最优化原理:如果问题的最优解包括子问题的最优解,那么问题的子问题解也是最优解,类似与贪心算法,从局部最优到整体最优;

    (2)无后效性:某一个状态一旦确定,将不受该状态以后的状态影响,只与当前状态有关,既无后效性;

    (3)有重叠子问题:子问题間不獨立,一個子問題在一個階段會多次調用;

    求問題的基本步驟:

    動態規劃處理的都是多個狀態的問題,那麼先從一個問題入手

    現在有3中硬幣面值為1,3,5,現在要用這三種硬幣湊成11,問所需的硬幣最少為多少?

    對於這個問題我們先從最簡單的分析:當i=0即我們需要多少枚硬幣湊夠0元,當然在所有的硬幣中沒有比1更小的,所以為0個,我們用符號記錄下來方便分析,即f(0)=0,那麼當i=1時,因為滿足的只有1元的硬幣,所以我們拿起一枚面值為一的硬幣,然後加上能組成0元的方法,然而這個我們已經知道了,所以f(1)=f(1-1)+1=1,同理那麼當i=2時,f(2)=f(2-1)+1=2,但是當i=3時候就不是這個狀態了,這時候我們要考慮面值為3的硬幣了,所以就分為兩種情況,f(3)=f(3-1)+1=f(2)+1=3,第二種方式f(3)=f(3-3)+1=f(0)+1=1 ,當i=3的兩種選擇解釋為,當我拿起一枚1元的硬幣那麼我需要在加上湊成兩元的硬幣那麼就是當前的方式,第二組我直接拿起面值為3的硬幣 那么只需要湊成0元的就是當前的方式,題目要求選取最小的組成,所以f(3)=1,所以得到的狀態轉移方程為f(i)=min(f(i-vi)+1),所謂的狀態轉移就是將一個大問題轉化為多個子問題解決,求子問題的最優解得到問題的最優解;

    偽代碼:

    for( i=1–S)

    for( j=0–n-1)

    if( v<i and  f(i)=min( f(i-v)+1,f(i) ) )

    其實這就是一維背包的算法。

  • 相关阅读:
    H3C BGP配置10BGP安全功能典型配置举例
    H3C BGP配置9调整和优化BGP网络典型配置举例1BGP负载分担配置
    H3C BGP配置11 BGP网络的可靠性典型配置举例1BGP GR配置
    H3C BGP配置9调整和优化BGP网络典型配置举例2BGP AddPath配置
    vue移动端适配postcsspxtorem
    .net 技术站点(转载)
    邯郸.net俱乐部
    存储过程从入门到熟练(多个存储过程完整实例及调用方法)_AX 转载
    gridview中删除记录的处理
    邯郸.NET俱乐部正式成立了
  • 原文地址:https://www.cnblogs.com/NYNU-ACM/p/4236876.html
Copyright © 2011-2022 走看看