一、简单的0,1背包问题
1、题目描述:有n个重量和价值分别为Wi,Vi的物品。从这些物品中挑选出总重量不超过W的物品,求所选方案中价值总和的最大值(注:在0,1背包问题中,每个物品只有一件,可以选择房或者不放)。
【分析】:对于这样的问题,首先我们可以用最简单容易想到的方法,将所有可能一一例举出来,找到最合适的。
对于函数rec(int i,int j)// 这里的 i 表...
分类:
其他好文 时间:
2014-08-13 19:06:47
阅读次数:
151
最大子矩阵是一种典型的dp问题。某种程度上说是最大连续子序列和问题的扩展。这里选取了两个HDU上的最大子矩阵和问题来解读。...
分类:
其他好文 时间:
2014-08-13 19:06:17
阅读次数:
168
最大连续子序列和问题
给定k个整数的序列{N1,N2,...,Nk },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1
注:为方便起见,如果所有整数均为负数,则最大子序列和为0。
解决这样一个问题是一个很有趣的过程,我们可以尝试着从复杂度比较高的算法一步一步地推出复杂度较低的算法。
算法一:
时间复杂度:O(N^3)...
分类:
其他好文 时间:
2014-08-13 19:06:07
阅读次数:
439
47.创新工场(算法):求一个数组的最长递减子序列 比如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5,4,3,2}思路:动态规划从最后一个数字开始,计算以当前数字其实的序列的最长递减子序列。 每次找最长子序列,都扫描它之前求得的子序列中最长,且第一个数字比当前数字小的。如: 第一个....
分类:
其他好文 时间:
2014-08-13 17:49:46
阅读次数:
231
最长上升子序列就是求给定序列的最长的递增序列,其中不要求序列的元素在原序列中保持连续。
为了方便理解,可以举个例子:
inta[] = {0,2,1,5,3,6,4,8,9,7}(数组下标从1开始)的一个最长的子序列1,3,4,7,9。
利用动态规划的思想,可以方便的求取这个解。
为了方便解释,我们定义dp(n)为长度为1至下标为n的最长子序列的长度(数组下标假设从1开始),{a[1],a...
分类:
其他好文 时间:
2014-08-13 14:55:17
阅读次数:
195
一、基本概念
动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。
动态规划是运筹学中用于求解决策过程中的最优化数学方法。当然,我们在这里关注的是作为一种算法设计技术,作为一种使用多阶段决策过程最优的通用方法。它是应用数学中用于解决某类最优化问题的重要工具。
如果问题是由交叠的子问题所...
分类:
其他好文 时间:
2014-08-13 03:36:25
阅读次数:
385
经典动态规划 无需单独枚举最后红塔的数量,因为对于dp[i][j],对于红塔的影响仅局限于i,j两个变量,与其前面塔排列无关,故二维动态规划即可。#include #include #include #include #include #include #include #include #inc....
分类:
其他好文 时间:
2014-08-13 03:31:56
阅读次数:
183
// 动态规划求最少钱币枚数#include int a[20],c[20][3000],k,n;int min(int x,int y){ return x>y?y:x; }int main(){ int i,j; scanf("%d",&k); for (i=0; i=...
分类:
其他好文 时间:
2014-08-12 21:58:14
阅读次数:
207
#include #include using namespace std;int dp[105][1005], w[105],v[105],T,M;int max(int x,int y){ return x>y?x:y; }void f( ){ int i,j; for (i=1; ...
分类:
其他好文 时间:
2014-08-12 21:55:54
阅读次数:
353
70 371 10069 11 2#include #include using namespace std;int dp[105][1005], w[105],v[105],T,M;int max(int x,int y){ return x>y?x:y; }void f( ){ ...
分类:
其他好文 时间:
2014-08-12 21:50:24
阅读次数:
299