动态规划算法

《趣学算法》动态规划

早过忘川 提交于 2019-12-06 04:20:12
2019-11-30 10:05:54 #include <bits/stdc++.h> #include <stdlib.h> #include <stdio.h> using namespace std; #define maxn 10005 #define M 105 int c[M][maxn]; int w[M],v[M]; int x[M];//x[M]表示第i个物品是否放入购物车 int main(){ int i,j,n,W; cout<<"请输入物品的个数: "; cin>> n; cout<<"请输入购物车的容量:"; cin>>W; cout<<"请输入每个物品的重量w 和 价值 v,用空格分开:"; for(int i=1;i<=n;++i){ cin>>w[i]>>v[i]; } for(i=0;i<=n;++i){ c[i][0]=0; } for(j=0;j<=W;++j){ c[0][j] = 0; } for(i=1;i<=n;++i){ for(int j=1;j<=W;++j){ if(j<w[i]){//当物品重量大于购物车容量时,不放入 c[i][j] = c[i-1][j]; } else{ c[i][j] = max(c[i-1][j],c[i-1][j-w[i]]+v[i]); } } } cout<<"装入购物车的最大价值为: "<

剑指offer-动态规划-贪心算法--剪绳子-python

北城以北 提交于 2019-12-04 20:42:30
题目描述 给你一根长度为n的绳子,请把绳子剪成m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],...,k[m]。请问k[0]xk[1]x...xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。 输入描述: 输入一个数n,意义见题面。(2 <= n <= 60) 思路:动态规划:有这几个特殊情况:当n为0时,没发裁输出为0n为1时,最大分子为1,输出1n为2时,最大分子为2,输出2n为3时,最大分子为2,输出2然后从4开始遍历,将切割的所有可能找出来,,由于当i大于n//2时,就不用在计算了,重复计算,然后与之相乘 temp = prod[i] * prod[n - i]最后将结果与max作比较,放入数组中去。 class Solution: def cutRope(self, number): # write code here # res=1 if number <= 1: return 0 elif number <= 2: return 1 elif number <= 3: return 2 prod = [0, 1, 2, 3] for n in range(4, number + 1): maxs = 0 for i in range(1, n//2): temp

常用算法解析-动态规划

…衆ロ難τιáo~ 提交于 2019-12-04 19:59:20
1 import java.util.HashMap; 2 3 /** 4 * 5 *原文链接: https://wx.abbao.cn/a/4736-4b66e5f9ec584ee0.html 6 * 7 * 走楼梯问题:有一座高度是10级台阶的楼梯,从下往上走,每跨一步只能向上1级或者2级台阶。要求用程序来求出一共有多少种走法。 8 * 9 * 這是一道入门级的动态递归问题 10 * 11 * 问题分析: 12 * 13 * 最有子结构: 最后一步走到第十层有多少种方法?2种:8-》10;9-》10 那么如果走到 8 有x种情况,走到9有y中情况 走到10可以看成x+y 14 * 15 * 状态转移方程 若用公式表达f(10)=f(9)+f(8) 既 f(n) = f(n-1) + f(n-2) 16 * 17 * 边界 走到第二层可以走一步,也可以走俩步。即f(2) = 2 第一层只能走一步 f(1) =1 18 * 19 * 以上是问题建模 解析来是问题求解 20 */ 21 public class WalkStair { 22 public static void main(String[] args) { 23 System.out.println(getWayStair1(10)); 24 System.out.println(getWayStair2(10,

java - 算法 -动态规划 - 01背包

对着背影说爱祢 提交于 2019-12-04 15:38:36
- -一个月前没搞明白,最近再学习一遍搞明白了。 问题: 给定3个物品 a 价值1000, 重量1kg b 价值2000, 重量4kg c 价值1500, 重量3kg 用容量为4kg的背包最多可以装价值多少的物品? 背包问题就是类似这种给定容量求最优解的问题,有很多种,这里说的是01背包问题。 01背包:所有物品只有一个,只所以背包中任意物品的的数量只可能是0 或者 1。 动态规划思路: 当前情况的思考建立在之前的思考之上。 01背包的逻辑思考过程: - -之前网上各种版本都是来个表格然后就开始代码了。。。一脸懵逼 我先假设只考虑第1个物品a,这样我就可以得到: 背包最大容量为0, 1,2,3,4时,最大价值为0, 1000,1000,1000,1000 然后再考虑前2个物品(a 和 b) 先考虑: 背包最大容量为0,1,2,3时, b装不下,所以还是用只考虑前1个物品时的策略,可以得到0, 1000,1000,1000 背包最大容量为4时,b可以装下了,这时候就面临选择,比较:是考虑往背包中加入b时的价值高, 还是只考虑前1个物品时的价值高。 1. 假设加入了b: 背包剩余可用的容量是: 背包最大容量 - b占用的容量 = 4 - 4 = 0; 此时背包物品的最大价值是: b的价值 + 剩余容量所能存放的还没加入b之前的最大值。 而剩余容量所能存放的还没加入b之前的最大值

如何理解动态规划

Deadly 提交于 2019-12-04 10:23:51
作者:冒泡 链接:https://www.zhihu.com/question/39948290/answer/83942329 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 如果楼主不是为了竞赛刷题,可以先抛开书本上的什么状态转移方程什么的,可以教你一个民科点的思路O(∩_∩)O: 我们面对的是一个求最优解或统计之类的问题,这个问题基于“我们要模拟完成一个大任务”,这个大任务可以分成若干步骤,每个步骤有若干种决策,每个步骤完成后,就到达了一个阶段性状态 比如,你要从A地到Z地,没有直达,所以第一步需要到一个中间地点,比如H或I,第二步再前进,比如到P或Q,最后到达Z,每一步有若干决策,比如第一步你可以决定到H或I的中的某个,大致就是这样一个模型,可以自己画个地图看看 等等,你大概发现问题了,如果第一步到H和I都可以,第二步到P和Q都可以,那我每一步只选最优,不就用贪心得到结果了吗,没错,如果你需要经历的每个阶段状态跟决策无关,那就贪心得到结果好了,理解贪心了吗:) 然而现实情况可能是,你第一步的选择会影响后面的分支,比如你第一步可以选择到H或I,但是到了H后,你只能选择经过P或Q到Z了,而如果到了I,你只能选择R或S到Z,这样一来,即便第一步到H或I你选择了较好的一条路,也不保证最终结果最优,因为比如你选了H,那万一I-R

不同路径II --动态规划

谁都会走 提交于 2019-12-04 06:19:15
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。 现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径? 网格中的障碍物和空位置分别用 1 和 0 来表示。 说明:m和n的值不超过100。 示例1: 输入: [ [0,0,0], [0,1,0], [0,0,0] ] 输出: 2 解释: 3x3 网格的正中间有一个障碍物。 从左上角到右下角一共有 2 条不同的路径: 1. 向右 -> 向右 -> 向下 -> 向下 2. 向下 -> 向下 -> 向右 -> 向右 解法一: 动态规划 思想算法: 如果第一个格子点是obstacleGrid[0][0] 是 1, 说明有障碍物,那么机器人就不能做任何的移动,我们就直接返回0; 否则如果obstacleGrid[0][0] 是 0, 我们初始化这个值为1,然后继续算法; 遍历第一行,如果有个格子是为1,说明当前节点有障碍物,没有路径可走,设置为0;否则设这个值是前一个节点的值,如下: let verticalValue = (obstacleGrid[0][i] == 0 && dp[0][i - 1] == 1) ? 1 : 0 dp[0].append(verticalValue)

算法第三章作业

孤者浪人 提交于 2019-12-03 09:50:07
1 .你对动态规划的理解 动态规划与分治法类似,基本思想也是将要求解的问题分解为若干个子问题,先求解子问题,再结合得到原问题的解;但与分治法不同的是,这些子问题不是独立的。 2. 分别列出编程题1、2的递归方程 第一题:b[j]=max(b[i]+1,b[j]) (a[i]<a[j] &&i< j) 第二题: dp[j]=min(dp[j],dp[i]+r[i][j]) (初始化 dp[j]=r[1][j]) 3.结对编程情况 先独立思考,遇到问题都会向对方提出来,然后一起思考问题,找出解决方案。 来源: https://www.cnblogs.com/lisihao/p/11786070.html

算法第三章作业

折月煮酒 提交于 2019-12-03 09:36:06
一、你对动态规划算法的理解    可以用动态规划解决的问题一般具有最优子结构,将一个问题分解成几部分,从解决子问题来解决整个问题,类似分治法,往往会用到备忘录方法来记录结果,避免重复运算。 二、两道编程题的递归方程   1. 单调递增最长子序列     dp[i]=max(dp[i],dp[j]+1)   2.租用游艇问题 d[m]=min(d[m] , d[mark]+rest[mark][m]) ( vis[m]=0) 三、结对编程情况   合作愉快,互相学习的过程,希望可以一起进步,把动态规划学好。 来源: https://www.cnblogs.com/xyishere/p/11785665.html

算法第三章作业

瘦欲@ 提交于 2019-12-03 09:30:18
1.动态规划是求解决策过程最优化的数学方法,也是一种能够减少重复运算的一种算法,比较适合原问题能依赖于子问题解得, 而子问题也能够依赖于子子问题解得而出的问题。 2. 编程题1和编程题2的递归方程 3-1 m[ i ] = a[ i ] i = 0; max { a[ i ] , a[ i ] + m[ i - 1 ] } i > 0 3-2 m[ i ] = min { c[ i ][ k ] + m[ k ] } (边界条件为m[ n ] = 0,n为终点) 3. 结对编程情况 结对编程一直都在进行,对自己的帮助还是很大,能知道自己的不足然后与伙伴交流,很好的提升自己的方式。 来源: https://www.cnblogs.com/fengwanthousand/p/11785477.html

算法第三章作业

假如想象 提交于 2019-12-03 09:13:42
1. 你对动态规划的理解 动态规划与分治法类似,将原问题分解为若干个子问题,先解决子问题,再结合这些子问题得到原问题的解。但与分治不同的是,通过备忘录或者填表的格式,解决了若干个子问题被重复计算的问题,有效降低时间复杂度。 2. 分别列出编程题 1 , 2 的递归方程 ① (a[i] > a[j])longest[i] = max(longest[i], longest[j] + 1) ② a[1][n] = max(a[1][n], a[1][k] + a[k][n])(1<k<=n ) 3. 说明结队编程的情况 队友开导我比较多,向我解释一些题目的动态规划原理。 来源: https://www.cnblogs.com/liuyuany/p/11785150.html