精华内容
下载资源
问答
  • 这道题若是在数学当中,是个典型的方程式应用题,假设用x表示鸡的数量,用y表示兔的数量,那么二元一次方程式为:①x+y=35;②2x+4y=94把①式带入②式中,解得x=23,y=12所以,我们得出鸡的数量有23只,兔的数量有12...

    《孙子算经》中记载着一个有趣的问题:今有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何?

    38d0d0d60a013e75a19232e9a03d5255.png

    这道题若是在数学当中,是个典型的方程式应用题,假设用x表示鸡的数量,用y表示兔的数量,那么二元一次方程式为:①x+y=35;②2x+4y=94271c5e01f5d028e064e7dbe1967b1f29.png把①式带入②式中,解得x=23,y=12所以,我们得出鸡的数量有23只,兔的数量有12只。上面的方法是我们利用数学知识,在二元一次方程式中算出来的。下面我们来说一下,如何利用规划求解来计算!
    规划求解作用:根据某些单元格的值的约束或限制,求得工作表上目标单元格中公式最优结果。要求:

    1、目标单元格必须是有公式的,且这个公式必须与变量相关

    2、必须要有约束条件

    d19f155f800b3e96a271f99884840db7.png

    位置:office excel中规划求解的位置:数据 → 规划求解另:规划求解在Excel任务栏【数据】模块下面,Excel默认未加载,依次点击【文件】-【选项】-【加载项】-【Excel加载项-转到】,勾中【规划求解加载项】,点击确定即可。

    40162445ca2629307c7879552e913654.png

    WPS excel中规划求解的位置:数据 → 模拟分析 → 规划求解

    8d6053e0e2406b5eff7ef7ca79be6a1b.png

    举例:题目:有若干只鸡兔同在一个笼子里,从上面数,有35个头,从下面数,有94只脚。问笼中各有多少只鸡和兔?思路:规划求解中我们需要填的几个内容有:目标内容、可变单元格、约束条件。由于我们想求鸡和兔的数量,所以我们将鸡和兔的数量所在的单元格设为可变单元格;脚的数量或者头的数量,选择其中一个作为目标值,另一个作为约束条件(今天我们拿头的数量作为约束条件,脚的数量作为目标值);因为我们鸡和兔的数量只能为整数,所以我们在约束条件中加一个数量为整数的条件。原始数据准备:根据已知条件,设定变量、约束条件和目标值位置,建立关系。

    90382f177a116ffc7fb39844bbab960b.png

    操作:设置好相关关系后,我们来打开规划求解,根据我们之前的思路进行填写。

    0d3868f42a9d5c88fb970ef711b0a57f.png

    当我们填好确认之后,会跳出规划求解结果,我们就能直接看到求出来的解咯,然后我们可以选择保留解和还原初值。

    522ebf2d07e8050373f2a582ce6ff5c1.png

    大家有木有学会呢?是不是觉得很简单呢?
    那接下来我给大家分享一个规划求解比较实用的操作——凑数,这个方法比较适用于财务岗位和税务岗位,会计对账和税务处理用的特别多。示例一:假设我们需要购入了一些商品,总金额为15470元,卖家本次先开票10000元,剩余部分下个月再开票。我们本月只需要根据发票金额支付给卖家10000元,我们写采购付款申请的时候,明细部分我们需要根据开票金额来填写,所以我们需要凑出一份金额为10000元的采购清单,来填写采购付款申请清单,如果是你会如何操作呢?

    2f94da017c93cae2be3640edd5f4b97a.png

    思路:我们的已知条件有商品种类、数量、单价、本次开票金额。我们需要思考他们直接的关系和在规划求解中所处的位置,总金额=所有单品金额的和,单品金额=单品数量(未知)*单价(已知),我们要求的是在每个单品数量多少的情况下,总金额为10000元。所以,我们单品数量所处的单元格为可变单元格,总金额公式所处的单元格为目标单元格(目标值设为10000),单品数量输出的结果要小于下单总数量,而且还要为整数,所以我们要设置几个约束条件。操作:首先我们要根据已知条件,建立关联关系。

    3447e9e96ca9d3d52616eb89c43b0d0b.png

    然后,我们根据之前的思路来进行求解。

    102ff5ea8d50e3bcbc2e94e8fb007d23.png

    规划求解参数详细图:

    9018521cb7055a96fa127894824f44fb.png

    求解之后,会跳出规划求解结果,我们就能直接看到求出来的解咯,然后我们可以选择保留解和还原初值,就完成啦!

    f4ea1de677129b8bef3b19ea58097228.png

    我们现在来检验一下,这个结果对不对。4a7057aec5f0d06c51ec3e6a2eab3598.png大家可以看到检验差额为0,总金额合计为10000,单品的数量也小于下单数量,完全木有问题!示例二:假设我们在一段时间内给一家公司开了好几张发票,6月23日收到了一笔85675元的回款,我们想对应一下回款对应的是哪几笔开票金额,你会如何操作呢?

    f2974964a51801642d31302cbbdd2360.png

    问题:本题主要是想找出几个数相加等于回款金额,所以目标值肯定是85675啦,那么目标单元格中的公式和可变单元格到底是什么呢?思路:我们将C列设为辅助列(结果只能为0或1),然后利用SUMPRODUCT函数进行乘积求和(查看SUMPRODUCT函数介绍点这里),故C2单元格到C12单元格为我们的可变单元格,运用SUMPRODUCT函数乘积求和的单元格设为目标单元格,C2单元格到C12单结果只能为0或1(二进制)作为约束条件。操作:找一个单元格输入SUMPRODUCT函数公式:=SUMPRODUCT(B2:B12*C2:C12)

    7fbc5481b2331bec119bd85b7c68f5cf.png

    然后,我们根据之前的思路来进行求解。

    daf19088e119eddc4809c207e3cc669b.png

    规划求解参数详细图:

    6aa439222bc6b4428b960e66ee01101a.png

    求解之后,会跳出规划求解结果,我们就能直接看到求出来的解咯,然后我们可以选择保留解和还原初值。

    47622a1a0b2b097e1e75320c12ca90d7.png

    显示1的是我们想要的结果,让我们一起来验证一下吧!

    4295063d060e45b4b8716a56b7626f3a.png

    大家可以看到上图,结果1所对应的金额合计正好是我们想要的85675元,是不是很简单啊!多变量求解的情况下,我们可以用规划求解,单变量的情况下,我们可以用单变量求解哦,有兴趣的小伙伴可以共同查看哦!(查看单变量求解点击这里)今天的分享就到这里咯,大家有学会嘛?

    --END--

    点一下在看 = 给沐柒点鼓励,让沐柒继续加油哟

    在后台和评论区可以给沐柒分享一下你的技巧和想法哦

    bb2b36c61d7b3b1de0194ad641595796.png

    喜欢我的小伙伴,记得关注我哦

    展开全文
  • 针对2011年全国大学生数学建模竞赛B的0-1规划应用场景,用python编程复现了模拟退火算法(解决较大规模0-1问题),还用Lingo求解了较小规模的0-1规划问题。资料中附了当年的题目,数据,和原创的复现代码(因为...
  • 人工智能能力人工智能能力是智能机器所执行的通常与人类智能有关的智能行为如判断推理证明识别感知理解通信设计思考规划学习和问题求解等思维活动 2 为什么能够用机器计算机模仿人的智能 答物理符号
  • 动态规划方法的matlab实现及其应用 (龙京鹏张华庆罗明良刘水林) (南昌航空大学数学与信息科学学院...众多类典型的动态规划应用问题尤其是确定离散型的应用问题的通用性提供了求解各种动态规划的有效工具关键词动态
  • 动态规划算法介绍 经典

    千次阅读 2009-09-28 09:49:00
    在介绍动态规划的原理之后,将分别考察动态规划方法在解决背包问题、图象压缩、矩阵乘法链、最短路径、无交叉子集和元件折叠等方面的应用。动态规划(dynamic programming)是运筹学的一个分支,是求解

     


    [align=left]动态规划是五种算法设计方法中难度最大的一种,它建立在最优原则的基础上。采用动态规划方法,可以优雅而高效地解决许多用贪婪算法或分而治之算法无法解决的问题。在介绍动态规划的原理之后,将分别考察动态规划方法在解决背包问题、图象压缩、矩阵乘法链、最短路径、无交叉子集和元件折叠等方面的应用。

    动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistep decision process)的优化问题时,提出了著名的最优化原理(principle of optimality),把多阶段过程转化为一系列单阶段问题,逐个求解,创立了解决这类过程优化问题的新方法——动态规划。1957年出版了他的名著 Dynamic Programming,这是该领域的第一本著作。

    动态规划问世以来,在经济管理、生产调度、工程技术和最优控制等方面得到了广泛的应用。例如最短路线、库存管理、资源分配、设备更新、排序、装载等问题,用动态规划方法比用其它方法求解更为方便。

    虽然动态规划主要用于求解以时间划分阶段的动态过程的优化问题,但是一些与时间无关的静态规划(如线性规划、非线性规划),只要人为地引进时间因素,把它视为多阶段决策过程,也可以用动态规划方法方便地求解。

    动态规划程序设计是对解最优化问题的一种途径、一种方法,而不是一种特殊算法。不象前面所述的那些搜索或数值计算那样,具有一个标准的数学表达式和明确清 晰的解题方法。动态规划程序设计往往是针对一种最优化问题,由于各种问题的性质不同,确定最优解的条件也互不相同,因而动态规划的设计方法对不同的问题, 有各具特色的解题方法,而不存在一种万能的动态规划算法,可以解决各类最优化问题。因此读者在学习时,除了要对基本概念和方法正确理解外,必须具体问题具 体分析处理,以丰富的想象力去建立模型,用创造性的技巧去求解。我们也可以通过对若干有代表性的问题的动态规划算法进行分析、讨论,逐渐学会并掌握这一设 计方法。

    和贪婪算法一样,在动态规划中,可将一个问题的解决方案视为一系列决策的结果。不同的是,在贪婪算法中,每采用一次贪婪准则便做出一个不可撤回的决策,而在动态规划中,还要考察每个最优决策序列中是否包含一个最优子序列。

    例3-1 [最短路经] 考察图1 2 - 2中的有向图。假设要寻找一条从源节点s= 1到目的节点d= 5的最短路径,即选择此路径所经过的各个节点。第一步可选择节点2,3或4。假设选择了节点3,则此时所要求解的问题变成:选择一条从3到5的最短路径。如果3到5的路径不是最短的,则从1开始经过3和5的路径也不会是最短的。例如,若选择的子路径(非最短路径)是3,2,5 (耗费为9 ),则1到5的路径为1,3,2,5 (耗费为11 ),这比选择最短子路径3,4,5而得到的1到5的路径1,3,4,5 (耗费为9) 耗费更大。

    所以在最短路径问题中,假如在的第一次决策时到达了某个节点v,那么不管v 是怎样确定的,此后选择从v 到d 的路径时,都必须采用最优策略。

    例3-2 [0/1背包问题] 考察1 3 . 4节的0 / 1背包问题。如前所述,在该问题中需要决定x1 .. xn的值。假设按i = 1,2,.,n 的次序来确定xi 的值。如果置x1 = 0,则问题转变为相对于其余物品(即物品2,3,.,n),背包容量仍为c 的背包问题。若置x1 = 1,问题就变为关于最大背包容量为c-w1 的问题。现设rÎ{c,c-w1 } 为剩余的背包容量。

    在第一次决策之后,剩下的问题便是考虑背包容量为r 时的决策。不管x1 是0或是1,[x2 ,.,xn ] 必须是第一次决策之后的一个最优方案,如果不是,则会有一个更好的方案[y2,.,yn ],因而[x1,y2,.,yn ]是一个更好的方案。

    假设n=3, w=[100,14,10], p=[20,18,15], c= 11 6。若设x1 = 1,则在本次决策之后,可用的背包容量为r= 116-100=16 。[x2,x3 ]=[0,1] 符合容量限制的条件,所得值为1 5,但因为[x2,x3 ]= [1,0] 同样符合容量条件且所得值为1 8,因此[x2,x3 ] = [ 0,1] 并非最优策略。即x= [ 1,0,1] 可改进为x= [ 1,1,0 ]。若设x1 = 0,则对于剩下的两种物品而言,容量限制条件为11 6。总之,如果子问题的结果[x2,x3 ]不是剩余情况下的一个最优解,则[x1,x2,x3 ]也不会是总体的最优解。

    例3-3 [航费] 某航线价格表为:从亚特兰大到纽约或芝加哥,或从洛杉矶到亚特兰大的费用为$ 1 0 0;从芝加哥到纽约票价$ 2 0;而对于路经亚特兰大的旅客,从亚特兰大到芝加哥的费用仅为$ 2 0。从洛杉矶到纽约的航线涉及到对中转机场的选择。如果问题状态的形式为(起点,终点),那么在选择从洛杉矶到亚特兰大后,问题的状态变为(亚特兰大,纽约)。从亚特兰大到纽约的最便宜航线是从亚特兰大直飞纽约,票价$ 1 0 0。而使用直飞方式时,从洛杉矶到纽约的花费为$ 2 0 0。不过,从洛杉矶到纽约的最便宜航线为洛杉矶-亚特兰大-芝加哥-纽约,其总花费为$ 1 4 0(在处理局部最优路径亚特兰大到纽约过程中选择了最低花费的路径:亚特兰大-芝加哥-纽约)。

    如果用三维数组(t a g,起点,终点)表示问题状态,其中t a g为0表示转飞, t a g为1表示其他情形,那么在到达亚特兰大后,状态的三维数组将变为( 0,亚特兰大,纽约),它对应的最优路径是经由芝加哥的那条路径。

    当最优决策序列中包含最优决策子序列时,可建立动态规划递归方程( d y n a m i c -programming recurrence equation),它可以帮助我们高效地解决问题。

    例3-4 [0/1背包] 在例3 - 2的0 / 1背包问题中,最优决策序列由最优决策子序列组成。假设f (i,y) 表示例1 5 - 2中剩余容量为y,剩余物品为i,i + 1,.,n 时的最优解的值,即:和利用最优序列由最优子序列构成的结论,可得到f 的递归式。f ( 1 ,c) 是初始时背包问题的最优解。可使用( 1 5 - 2)式通过递归或迭代来求解f ( 1 ,c)。从f (n, * )开始迭式, f (n, * )由(1 5 - 1)式得出,然后由( 1 5 - 2)式递归计算f (i,*) ( i=n- 1,n- 2,., 2 ),最后由( 1 5 - 2)式得出f ( 1 ,c)。

    对于例1 5 - 2,若0≤y<1 0,则f ( 3 ,y) = 0;若y≥1 0,f ( 3 ,y) = 1 5。利用递归式(1 5 - 2),可得f (2, y) = 0 ( 0≤y<10 );f(2,y)= 1 5(1 0≤y<1 4);f(2,y)= 1 8(1 4≤y<2 4)和f(2,y)= 3 3(y≥2 4)。因此最优解f ( 1 , 11 6 ) = m a x {f(2,11 6),f(2,11 6 - w1)+ p1} = m a x {f(2,11 6),f(2,1 6)+ 2 0 } = m a x { 3 3,3 8 } = 3 8。

    现在计算xi 值,步骤如下:若f ( 1 ,c) =f ( 2 ,c),则x1 = 0,否则x1 = 1。接下来需从剩余容量c-w1中寻求最优解,用f (2, c-w1) 表示最优解。依此类推,可得到所有的xi (i= 1.n) 值。

    在该例中,可得出f ( 2 , 11 6 ) = 3 3≠f ( 1 , 11 6 ),所以x1 = 1。接着利用返回值3 8 -p1=18 计算x2 及x3,此时r = 11 6 -w1 = 1 6,又由f ( 2 , 1 6 ) = 1 8,得f ( 3 , 1 6 ) = 1 4≠f ( 2 , 1 6 ),因此x2 = 1,此时r= 1 6 -w2 = 2,所以f (3,2) =0,即得x3 = 0。

    动态规划方法采用最优原则( principle of optimality)来建立用于计算最优解的递归式。所谓最优原则即不管前面的策略如何,此后的决策必须是基于当前状态(由上一次决策产生)的最优决策。由于对于有些问题的某些递归式来说并不一定能保证最优原则,因此在求解问题时有必要对它进行验证。若不能保持最优原则,则不可应用动态规划方法。在得到最优解的递归式之后,需要执行回溯(t r a c e b a c k)以构造最优解。

    编写一个简单的递归程序来求解动态规划递归方程是一件很诱人的事。然而,正如我们将在下文看到的,如果不努力地去避免重复计算,递归程序的复杂性将非常可观。如果在递归程序设计中解决了重复计算问题时,复杂性将急剧下降。动态规划递归方程也可用迭代方式来求解,这时很自然地避免了重复计算。尽管迭代程序与避免重复计算的递归程序有相同的复杂性,但迭代程序不需要附加的递归栈空间,因此将比避免重复计算的递归程序更快。

    展开全文
  • 实验四 动态规划算法设计与应用 一. 实验目的和要求 1.加深对动态规划算法的基本原理的理解,掌握用动态规划方法求解最...4.选做:用动态规划设计求解0/1背包问题的算法,分析其复杂性,并实现。 二. 实验步骤 实...

    一. 实验目的和要求
    1.加深对动态规划算法的基本原理的理解,掌握用动态规划方法求解最优化问题的方法步骤及应用;
    2.用动态规划设计整数序列的最长递增子序列问题的算法,分析其复杂性,并实现;
    3.用动态规划设计求凸多边形的三角剖分问题的算法,分析其复杂性,并实现。
    4.选做题:用动态规划设计求解0/1背包问题的算法,分析其复杂性,并实现。
    二. 实验步骤

    实验一: 最长递增子序列问题:
    问题描述:
    求一个由n个整数组成的整数序列的最长递增子序列。一个整数序列的递增子序列可以是序列中非连续的数按照原序列顺序排列而成的。 最长递增子序列是其递增子序列中长度最长的。

    1. 问题分析
      给你n个数,让你求出他的最长上升子序列(LIS),并输出最长的序列
      几个数。考虑用动态规划解决,首先可以考虑O(n2)O(n^2)的dp,dp[i]dp[i]表示到第i个数的最长的值,那么我们就可以得到转移方程dp[i]=max(dp[i],dp[j]+1);dp[i] = max(dp[i],dp[j] + 1);最后对dp遍历找出最大的值即可。用pre数组记录序列数的下标,转置输出即可。
      当然还有复杂度为O(nlogn)O(nlogn)的方法,即用一个tmp数组来存目前的排序好的数组,然后每次lower_bound出位置即为最大上升序列的位置,即为dp[i]的值。但是这种方法对于记录下标依然是O(n2)O(n^2)的复杂度。

    2.设计与实现

    #include<bits/stdc++.h>
    #define mes(a, b)  memset(a, b, sizeof a)
    #define pb push_back
    typedef unsigned long long int ull;
    typedef long long int ll;
    const int    maxn = 1e6 + 20;
    const int    maxm = 1e5 + 10;
    const ll     mod  = 1e9 + 7;
    const ll     INF  = 1e18 + 100;
    const int    inf  = 0x3f3f3f3f;
    const double pi   = acos(-1.0);
    const double eps  = 1e-8;
    using namespace std;
    int dp[maxn],pre[maxn],a[maxn];
    std::vector<int> ans;
    int main(){
    	int _;
    	for(scanf("%d",&_);_;_--){
    		ans.clear();	
    		mes(dp,0);mes(pre,-1);
    		int n;scanf("%d",&n);
    		for(int i = 1;i <= n;i++) scanf("%d",&a[i]),dp[i] = 1;
    		for(int i = 1;i <= n;i++){
    			for(int j = 1;j < i;j++){
    				if(a[i] > a[j]){
    					if(dp[i] < dp[j] + 1) dp[i] = dp[j] + 1,pre[i] = j;
    				}
    			}
    		}
    		int pos,maxx = 0;
    		for(int i = 1;i <= n;i++){
    			if(dp[i] > maxx) maxx = dp[i],pos = i;
    		}
    		printf("%d\n",maxx);
    		for(int i = pos;i != -1;i = pre[i]){
    			ans.pb(a[i]);
    		}
    		reverse(ans.begin(), ans.end());
    		for(auto it : ans) printf("%d ",it);
    		puts("");puts(" ");
    	}
    }
    
    

    实验(二) 凸多边形的三角剖分:
    问题描述
    设P是一个有n个顶点的凸多边形,P中的弦是P中连接两个非相邻顶点的线段。用P中的(n-3)条弦将P剖分成(n-2)个三角形(如下图所示)。使得(n-3)条弦的长度之和最小的三角形剖分称为最优三角剖分。

    1.问题分析
    要求凸多边形的最优三角剖分,我们先预处理出每个顶点之间的距离,然后考虑区间合并,考虑递归,以i为点的边将凸多边形分为一个三角形和若干个凸多边形,如果k = a + 1,那么剩下的还是一个凸多边形,当k = b – 1时同理,其他情况考虑递归转移式:num[i]=calc(a,k)+dis[a][k]+calc(k,b)+dis[k][b];num[i] = calc(a,k) + dis[a][k] + calc(k,b)+dis[k][b];然后找出最大的num[i]的值即可。复杂度O(n3)O(n^3)
    2.设计与实现

    #include<bits/stdc++.h>
    #define mes(a, b)  memset(a, b, sizeof a)
    #define pb push_back
    typedef unsigned long long int ull;
    typedef long long int ll;
    const int    maxn = 550 + 20;
    const int    maxm = 1e5 + 10;
    const ll     mod  = 1e9 + 7;
    const ll     INF  = 1e18 + 100;
    const int    inf  = 0x3f3f3f3f;
    const double pi   = acos(-1.0);
    const double eps  = 1e-8;
    using namespace std;
    double dis[maxn][maxn];
    double x[maxn],y[maxn];
    int n;
    void init(){
    	for(int i = 1;i <= n;i++){
    		for(int j = 1;j <= n;j++){
    			dis[i][j] = sqrt((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]));
    		}
    	}
    }
    double calc(int b,int c){
    	double s = INF;std::vector<double> v;
    	if(c - b == 2) return 0;
    	for(int i = b + 1;i < c;i++){
    		if(i == b + 1) v.pb(calc(i,c) + dis[b + 1][c]);
    		else if(i == c - 1) v.pb(calc(b,i) + dis[b][c - 1]);
    		else v.pb(calc(i,c) + calc(b,i) + dis[b][i] + dis[i][c]);
    	}
    	for(auto it : v) s = min(it,s);
    	return s;
    }
    int main(){
    	int _;
    	for(scanf("%d",&_);_;_--){
    		scanf("%d",&n);
    		for(int i = 1;i <= n;i++) scanf("%lf %lf",&x[i],&y[i]);
    		init();
    		printf("%.3f\n",calc(1,n));
    	}
    }
    
    

    实验(三) 选做题――0/1背包问题:
    问题描述
    设有一个容量为C的背包,n个物品的集合U={u1, u2, …, un},物品uj的体积和价值分别为sj和vj,C, sj, vj都是正整数。在U中选择物品装入背包,使得装入背包的物品总价值最大。设每种物品或完全装入或完全不装入背包。

    1.问题分析
    经典的01背包问题,易得转移方程:
    dp[i][j]=max(dp[i1][j],dp[i1][jc[i]]+w[i])dp[i][j] = max(dp[i- 1][j],dp[i – 1][j – c[i]] + w[i])
    记录路径直接用dp[][]dp[][]数组求解,看他是从哪个状态转移过来的即可。
    当然也可以滚动为一维,也易得
    dp[j]=max(dp[j],dp[jc[i]]+w[i]);dp[j] = max(dp[j],dp[j – c[i]] + w[i]);
    但是滚动成一维就无法倒推了。
    2.设计与实现

    #include<bits/stdc++.h>
    #define mes(a, b)  memset(a, b, sizeof a)
    #define pb push_back
    typedef unsigned long long int ull;
    typedef long long int ll;
    const int    maxn = 1e6 + 20;
    const int    maxm = 1e5 + 10;
    const ll     mod  = 1e9 + 7;
    const ll     INF  = 1e18 + 100;
    const int    inf  = 0x3f3f3f3f;
    const double pi   = acos(-1.0);
    const double eps  = 1e-8;
    using namespace std;
    int dp[110][5100],s[maxn],val[maxn];
    set<int>ans;
    int _;
    int main(){
    	for(scanf("%d",&_);_;_--){
    		mes(dp,0);ans.clear();
    		int n,c;scanf("%d %d",&n,&c);
    		for(int i = 1;i <= n;i++) scanf("%d",&s[i]);
    		for(int i = 1;i <= n;i++) scanf("%d",&val[i]);
    		for(int i =  1;i <= n;i++){
    			for(int j = c;j >= 0;j--){
    				dp[i][j] = dp[i - 1][j];
    				if(j < s[i]) continue;
    				dp[i][j] = max(dp[i - 1][j],dp[i - 1][j - s[i]] + val[i]);
    			}
    		}
    		printf("%d\n",dp[n][c]);
    		for(int i = n,j = c;i >= 1 && j >= 0;i--){
    			if(dp[i][j] == dp[i - 1][j - s[i]] + val[i]){
    				ans.insert(i);j -= s[i];
    			}
    		}
    		for(int i = 1;i <= n;i++) if(ans.count(i)) putchar('1 ');else putchar('0 ');
    		puts("");
    	}
    }
    
    

    ps:代码基于c++11,无法运行请打开编译器c++11开关

    展开全文
  • 高等应用数学问题的MATLAB求解随书光盘 光盘分为两部分上传,第一部分是CAI教学资源 第一部分的资源名为:高等应用数学问题的MATLAB求解光盘 part1:包含书中CAI教学材料 光盘使用说明 本光盘是薛定宇和陈阳泉所著...
  • 高等应用数学问题的MATLAB求解随书光盘 光盘分为两部分上传,第一部分是CAI教学资源 第二部分的资源名为:高等应用数学问题的MATLAB求解光盘 part2:包含书中开发函数,使用资源及例题全部代码 光盘使用说明 本光盘...
  • 《高等应用数学问题的MATLAB求解》光盘资料。供大家参考学习 本光盘包括如下目录: “CAI教学材料” 包含全套的PowerPoint文件,可以直接用于教学,具体请参见该目录中的readme.pps文件说明。目前包含的为中文版...
  • 《高等应用数学问题的MATLAB求解》一书的配书光盘。供大家参考学习 本光盘包括如下目录: “CAI教学材料” 包含全套的PowerPoint文件,可以直接用于教学,具体请参见该目录中的readme.pps文件说明。目前包含的...
  • 01分数规划是这样的一类问题,有一堆物品,每一个物品有一个收益ai,一个代价bi,我们要求一个方案使选择的∑ai/∑bi∑ai/∑bi最大。 两种做法:1、二分不断迫近答案 2、在前一个解的基础上精确下一个解 模板如下...

    01分数规划是这样的一类问题,有一堆物品,每一个物品有一个收益ai,一个代价bi,我们要求一个方案使选择的∑ai/∑bi∑ai/∑bi最大。

    两种做法:1、二分不断迫近答案    2、在前一个解的基础上精确下一个解

    模板如下(例题为2018牛客网多校第5场A题)

    1、二分求解

    struct node{
        double s,c,ans;
    }cur[MAXN];
    
    bool cmp(double a,double b)
    {
        return a>b;
    }
    
    bool check(double x)
    {
        for(int i=1;i<=n;i++)
        ans[i]=cur[i].s*(cur[i].c-x);
        sort(ans+1,ans+n+1,cmp);
        double sum=0;
        for(int i=1;i<=n-k;i++)
        sum+=ans[i];
         return sum>0;
    }
    void solve()
    {
        double l=0,r=100,m;
        scanf("%d %d",&n,&k);
        for(int i=1;i<=n;i++)
        scanf("%lf",&cur[i].s);
        for(int i=1;i<=n;i++)
         scanf("%lf",&cur[i].c);
        while(r-l>1e-6){
            m=(l+r)/2;
            if(check(m))
            l=m;
            else
            r=m;
        }
    }

    r的范围需要根据题意去自己判定

    2、根据前一个解求解

    struct node{
        double s,c,ans;
    }cur[MAXN];
    bool cmp(node a,node b)
    {
        return a.ans>b.ans;
    }
    double check(double x)
    {
        for(int i=1;i<=n;i++)
        cur[i].ans=cur[i].s*(cur[i].c-x);
        sort(cur+1,cur+n+1,cmp);
        double aa=0,bb=0;
        for(int i=1;i<=n-k;i++)
        {
         aa+=cur[i].c*cur[i].s;
         bb+=cur[i].s;
        }
         return aa/bb;
    }
    void solve()
    {
        double da=1,gj=0;
        scanf("%d %d",&n,&k);
        for(int i=1;i<=n;i++)
        scanf("%lf",&cur[i].s);
        for(int i=1;i<=n;i++)
         scanf("%lf",&cur[i].c);
         while(da-gj>1e-6){
             gj = da;
             da=check(da);
         }
    
    }

    链接:https://www.nowcoder.com/acm/contest/143/A
    来源:牛客网
     

    题目描述

    Kanade selected n courses in the university. The academic credit of the i-th course is s[i] and the score of the i-th course is c[i].

    At the university where she attended, the final score of her is 

    Now she can delete at most k courses and she want to know what the highest final score that can get.

    输入描述:

    The first line has two positive integers n,k
    
    The second line has n positive integers s[i]
    
    The third line has n positive integers c[i]

    输出描述:

    Output the highest final score, your answer is correct if and only if the absolute error with the standard answer is no more than 10-5

     

    示例1

    输入

    复制

    3 1
    1 2 3
    3 2 1

    输出

    复制

    2.33333333333

    说明

    Delete the third course and the final score is 

    备注:

    1≤ n≤ 105
    
    0≤ k < n
    
    1≤ s[i],c[i] ≤ 103
    展开全文
  • 应用动态规划求解的问题的特点二、贪婪算法三、题目描述四、解题思路(一)动态规划1. 思路分析2. 代码实现(动态规划)3. 时间复杂度O(n^2)(二)贪婪算法1. 思路分析2. 代码实现3. 时间复杂度O(1) 一、动态规划 1...
  • Dynamic programming 动态规划,与分治法相似,都是通过组合子问题的解来求解原问题,但动态规划应用于子问题重叠的场景,每个子问题都只求一遍,将解存入表格中,避免不必要的重复工作。 问题:购买长钢条,将其...
  • 其主要思想,就是通过把原问题分解为相对简单的子问题的方式求解复杂问题的算法思想,当然,动态规划只能应用于有最优子结构的问题。最优子结构的意思是局部最优解能决定全局最优解(对有些问题这个要求并不能完全...
  • 可以应用动态规划求解的问题具备以下三个特点: 1、求一个问题的最优解 2、整体问题的最优解是依赖各个子问题的最优解 3、把大问题分解成若干个小问题,这些小问题之间还有相互重叠的更小的子问题 4、从上往下分析...
  • 1. 目标规划的数学模型 1.1 目标规划的概念 1.2 目标规划的一般数学模型 2. 求解目标规划的序贯算法 3. 多目标规划的matlab解法 原课本习题及代码 点击下载 【课本 + 源码 】 提取码:92h8
  • 习题1.3(b):分别用图解法和单纯形法求解下述线性规划问题,并对照指出单纯形表中的各基可行解分别对应图解法中可行域的哪一顶点.$\max z=2x_1+x_2$,$$s.t.\begin{cases} 5x_2\leq 15\\6x_1+2x_2\leq 24\\x_1+x_2\leq ...
  • 用图解法求解下列线性规划问题,并指出问题具有惟一最优解,无穷多最优解,无界解还是无可行解.习题1.1(b):$\max z=3x_1+2x_2$$$s.t\begin{cases} 2x_1+x_2\leq 2\\3x_1+4x_2\geq 12\\x_1,x_2\geq 0\\\end{cases}$$解答...
  • 非线性规划求解命令fmincon 例题一 例题二 二次规划求解命令quadprog 二次规划定义:若某非线性规划的目标函数为自变量x的二次函数,约束条件又全是线性的,则称这种规划为二次规划。 例题一 例题二 注意:该...
  • 学习动态规划

    2019-08-14 06:50:58
    今天开始学习动态规划: 首先得思考这几个问题? 1.何谓动态规划?...1.把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解,创立了解决这类过程优化问题的新方法——动态规划 2.动态规...
  • 矩阵连乘---动态规划

    2020-03-11 12:01:44
    适用的问题前三点和分治法相同,不同的是应用动态规划求解一般子问题之间不独立,需要辅助空间记录子问题的值来减少求解次数 基本步骤: 1.找出最优解的性质,并描述其结构特征(最优子结构性质)(由子问题的最...
  • 动态规划2

    千次阅读 2006-06-04 17:47:00
    近年来,在ACM/ICPC中,使用动态规划(或部分应用动态规划思维)求解不仅常见,而且形式也多种多样。而在与此相近的各类信息学竞赛中,应用动态规划解题已经成为一种趋势,这和动态规划的优势不无关系。 1、动态...
  • 区间动态规划问题一般都是考虑,对于每段区间,他们的最优值都是由几段更小区间的最优值得到,是分治思想的一种应用,将一个区间问题不断划分为更小的区间直至一个元素组成的区间,枚举他们的组合 ,求合并后的最优...
  • 动态规划 背包问题

    2015-04-24 18:37:34
    近年来,涉及动态规划的各种竞赛越来越多,每一年的NOIP都至少有一道题目需要用动态规划求解。而应用动态规划法解题是富于技巧性和创造性的,虽然在前面的求解过程中给出了一个解题的基本模式,但由于动态规划...
  •  转:此是对01分数规划应用,那么首先明白01分数规划的思想. 01整数规划问题就是求解方程(a1*x1+a2*x2+..+an*xn)/(b1*x1+b2*x2+..+bn*xn)的最小值/最大值问题。其中xi = 0或1(i=1,2...n)对于此
  • 动态规划之备忘录法

    千次阅读 2015-11-04 21:04:58
    动态规划与分治方法相似,都是通过组合子问题的解来求解原文。分治方法将问题划分为互不相交的子问题,递归地求解子问题,再将它们的解组合起来,求出原问题的解。与之相反,动态规划应用于子问题重叠的情况,即...
  • 为leetcode上的题目,现实中有很多应用场景,比如买股票,确定哪段时间股票涨值价格最高。 下面给出两种解决方式,一种为为Divide and Conquer,第二种算法为动态规划,即Kadane's algorithm 方法 /** * @param...
  • 9.6 线性规划 求解 2 Excel 规划求解问题由以下 3 部分组成 ? 1 可变单元格 ? 2 目标函数 ? 3 约束条件 9.6.2 建立规划 求解模型 3 案例 ? 例 9.8 某肥料厂专门收集有机物垃圾如 青草树枝凋谢的花朵等该厂利用这些废...

空空如也

空空如也

1 2 3 4 5 ... 14
收藏数 271
精华内容 108
关键字:

规划求解应用题