动态规划例题众多详细讲解.
- 格式:ppt
- 大小:772.50 KB
- 文档页数:59


动态规划的具体应用例题
3.1 最长不降子序列
(1)问题描述
设有由n个不相同的整数组成的数列,记为:
a(1)、a(2)、……、a(n)且a(i)<>a(j) (i<>j)
例如3,18,7,14,10,12,23,41,16,24。
若存在i1
(2)算法分析
根据动态规划的原理,由后往前进行搜索。
1· 对a(n)来说,由于它是最后一个数,所以当从a(n)开始查找时,只存在长度为1的不下降序列;
2· 若从a(n-1)开始查找,则存在下面的两种可能性:
①若a(n-1)
②若a(n-1)>a(n)则存在长度为1的不下降序列a(n-1)或a(n)。
3· 一般若从a(i)开始,此时最长不下降序列应该按下列方法求出:
在a(i+1),a(i+2),…,a(n)中,找出一个比a(i)大的且最长的不下降序列,作为它的后继。 4.用数组b(i),c(i)分别记录点i到n的最长的不降子序列的长度和点i后继接点的编号
(3) 程序如下:(逆推法)
program li1;
const maxn=100;
var a,b,c:array[1..maxn] of integer;
fname:string;
f:text;
n,i,j,max,p:integer;
begin
readln(fname);
assign(f,fname);
reset(f);
readln(f,n);+
for i:=1 to n do
begin
read(f,a[i]);
b[n]:=1;
c[n]:=0;
end;
for i:= n-1 downto 1 do
begin max:=0;p:=0;
for j:=i+1 to n do
if (a[i]max) then begin max:=b[j];p:=j
end;
if p<>0 then begin b[i]:=b[p]+1;c[i]:=p end
动态规划例题
动态规划是一种以最优化原理为基础的问题求解方法,通过拆分问题为若干阶段,每个阶段求解一个子问题,再逐步推导出整个问题的最优解。
例如,有一个背包能够承受一定的重量,现有一些物品,每个物品都有自己的重量和价值。我们希望将物品放入背包中,使得背包的总价值最大。这个问题可以用动态规划来解决。
首先,我们定义一个二维数组dp,其中dp[i][j]表示在前i个物品中,容量为j的背包中所能放入的物品的最大价值。那么,对于每一个物品,可以选择放入背包或者不放入背包。如果选择放入背包,最大价值为dp[i-1][j-w[i]] + v[i],其中w[i]表示第i个物品的重量,v[i]表示第i个物品的价值。如果选择不放入背包,最大价值为dp[i-1][j]。因此,dp[i][j]的状态转移方程为:dp[i][j] = max(dp[i-1][j-w[i]] + v[i], dp[i-1][j])。
基于这个状态转移方程,可以逐步求解从第1个物品到第n个物品的最大价值。最终,dp[n][W]即为问题的最优解,其中W表示背包的容量。
举个简单的例子,假设背包的容量为10,有3个物品,它们的重量分别为3、4、5,价值分别为4、5、6。此时,可以得到如下的dp矩阵:
0 0 0 0 0 0 0 0 0 0 0
0 0 0 4 4 4 4 4 4 4 4 0 0 0 4 5 5 9 9 9 9 9
0 0 0 4 5 5 9 10 10 14 14
我们可以看到,dp[3][10]的最大价值为14,表示在前3个物品中,容量为10的背包中所能放入的物品的最大价值为14。
南京航空航天大学 运筹学 课程论文
题目:动态规划应用举例
学号:
姓名:
完成日期:2013。5。16
摘 要
动态规划是解决最优控制的一种重要方法之一,算法的优点有:(1)易于确定全局最优解;(2)能得到一族解,有利于分析结果;(3)能利用经验,提高求解的效率。动态规划方法虽然存在许多不足之处,但随着计算机的日益普及,动态规划的应用越来越广泛,它能够巧妙地解决科学技术和实际生活中的许多实例。本文列举了一些典型例题,介绍了如何用动态规划去求解,不足之处是这些问题大多数都是确定型的,而对于连续型、随机型问题接触较少。
关键词:动态规划;应用;
正 文
一、 资源分配问题
所谓分配问题,就是将数量一定的一种或若干种资源(例如原材料、资金、机器设备、劳力、食品等等),恰当地分配给若干个使用者,而使目标函数为最优。
设有某种原料,总数量为a,用于生产n种产品。若分配数量ix用于生产第i种产品,其收益为()iigx,问应如何分配,才能使生产n产品的总收入最大?
此问题可写成静态规划问题:
112212max ()()()0, 1,2,,nnnizgxgxgxxxxaxin
当()iigx都是线性函数时,它是一个线性规划问题;当()iigx是非线性函数时,它是一个非线性规划问题。但当n比较大时,具体求解是比较麻烦的。由于这类问题的特殊结构,可以将它看成一个多阶段决策问题,并利用动态规划的递推关系来求解。
在应用动态规划方法处理这类“静态规划”问题时,通常以把资源分配给一个或几个使用者的过程作为一个阶段,把问题中的变量ix为决策变量,将累计的量或随递推过程变化的量选为状态变量。
设状态变量ks表示分配用于生产第k种产品至第n种产品的原料数量。
决策变量ku表示分配给生产第k种产品的原料数,即ku=kx
动态规划详解(C++版)
动态规划
一、背包问题:
01背包问题
题目
有N件物品和一个容积为V的背包。第i件物品的体积是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。
基本思路
这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。
用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是:
二维方程:f[i,v]:=max(f[i-1,v],f[i-1,v-c[i]]+w[i])
一维方程:f[v]:=max(f[v],f[v-c[i]]+w[i]);
这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它衍生出来的。所以有必要将它详细解释一下:“将前i件物品放入容量为v的背包中”这个子问题,若只考虑第i件物品放或不放,那么就可以转化为一个只牵扯前i-1件物品的问题。如果不放第i件物品,那么问题就转化为“前i-1件物品放入容量为v的背包中”,价值为f[i-1][v];如果放第i件物品,那么问题就转化为“前i-1件物品放入剩下的容量为v-c[i]的背包中”,此时能获得的最大价值就是f[i-1][v-c[i]]再加上通过放入第i件物品获得的价值w[i]。
1.采药(RQNOJ15);
题目描述:
辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。”
如果你是辰辰,你能完成这个任务吗?
输入格式:
输入的第一行有两个整数T(1 <= T <= 1000)和M(1 <= M
<= 100),用一个空格隔开,T代表总共能够用来采药的时间,M代表山洞里的草药的数目。接下来的M行每行包括两个在1到100之间(包括1和100)的整数,分别表示采摘某株草药的时间和这株草药的价值。