前言:很久没有发博客了,以后会捡起来,之后很长一段时间内我都会把精力放在攻克DP问题上,所以会经常上传一些DP学习笔记,把一些比较好的,没见过类型的DP问题都会传上来,希望能够变强吧. 因为今天很清醒的意识到世上有很多很优秀很惊艳的人,自己也要努力,努力成为那样的人啊 . 例题 洛谷P1164 小A点菜 分析:乍看就是一个普通的01背包,仔细看下要求钱是要全花完的,而且dp数组内保存的不是最大价值,而应该是方法的数量,这样处理起来是很不一样了 这道题第三次做,之前两次做都是最后无奈的屈从了题解,…
01背包问题之2 有n个物品,重量和价值分别为wi和vi,从这些物品中挑选出重量不超过W的物品,求所有挑选方案中物品价值总和的最大值 限制条件: 1 <= n <= 100; 1 <= wi<= 10^7; 1 <= vi <= 100; 1 <= W <= 10^9; 分析:数据量更大,之前求解该问题的时间复杂度为o(nW),在这一问题来说会超时,在这个问题里重量很大,但是价值很小,可以考虑价值,改变dp的对象,针对不同的价值来计算最小的质量 因为是求最小…
有n个物品,重量和价值分别为wi和vi,从这些物品中挑选出重量不超过W的物品,求所有挑选方案中物品价值总和的最大值 限制条件: 1 <= n <= 100; 1 <= wi,vi <= 100; 1 <= W <= 10000; 分析:经典的01背包问题 状态:dp[i][j] = 前i个物品中挑选重量不超过j的价值最大值 状态转移方程:dp[i+1][j] = max(dp[i][j], dp[i][j - w[i]] + v[i]); 利用翻滚数组即一维数组可以大大…
对于普通的01背包问题,如果修改限制条件的大小,让数据范围比较大的话,比如相比较重量而言,价值的范围比较小,我们可以试着修改dp的对象,之前的dp针对不同的重量限制计算最大的价值.这次用dp针对不同的价值计算最小的重量. 定义dp[i+1][j],前i个物品中挑选出价值总和为j时总重量的最小值(不存在时就是一个充分大的数值INF).由于前0个物品中什么都挑选不了,所以初值为: dp[0][0]=0; dp[0][j]=INF; 此外,前i个物品中挑选出价值总和为j时,一定有 前i-1个物品中挑选…
题目链接:http://poj.org/problem?id=3624 1.p[i][j]表示,背包容量为j,从i,i+1,i+2,...,n的最优解. 2.递推公式 p[i][j]=max(p[i+1][j],p[i+1][j-w[i]]+v[i]); #include <stdio.h> #include <algorithm> #include <string.h> #define NUM 3410 //物品数量的上限 #define CAP 1300 //背包容…
1068 Find More Coins (30 分)   Eva loves to collect coins from all over the universe, including some other planets like Mars. One day she visited a universal shopping mall which could accept all kinds of coins as payments. However, there was a special…
中文理解: 0-1背包问题:有一个贼在偷窃一家商店时,发现有n件物品,第i件物品价值vi元,重wi磅,此处vi与wi都是整数.他希望带走的东西越值钱越好,但他的背包中至多只能装下W磅的东西,W为一整数.应该带走哪几样东西?这个问题之所以称为0-1背包,是因为每件物品或被带走:或被留下:小偷不能只带走某个物品的一部分或带走同一物品两次. 在分数(部分)背包问题(fractional knapsack problem)中,场景与上面问题一样,但是窃贼可以带走物品的一部分,而不必做出0-1的二分选择.…
目录 问题描述 问题分析 问题求解 Java代码实现 优化方向一:时间方面:因为是j是整数是跳跃式的,可以选择性的填表. 思考二:处理j(背包容量),w(重量)不为整数的时候,因为j不为整数了,它就没办法作为数组下标使用. 总结 问题描述 有n个物品,第i种物品的价值为\(p_i\)重量为\(W_i\),选一些物品到一个容量为C的背包里,使得背包内物品在总重量不超过C的前提下,价值尽量大. 问题分析  在之前我们了解贪心思想的时候曾经有过类似的题目那时候物品是可拆分的我们只需要选择单位重量最大的…
[问题描述] 0-1背包问题:有 N 个物品,物品 i 的重量为整数 wi >=0,价值为整数 vi >=0,背包所能承受的最大重量为整数 C.如果限定每种物品只能选择0个或1个,求可装的最大价值. 可以用公式表示为:  [算法思路] 动态规划法.我们可以想到这个问题具有最优子结构性质,假设(x1,x2,...,xn)是最优解,那么在去除x1之后,剩下(x2,...,xn)肯定是以下问题的最优解: 根据这个特征可以设计DP函数并推出递归关系.具体地,m(i,j)是背包容量为j,可选择物品为i,…
我一开始是这么想的 注意这道题数组下标是从大到小推,不是一般的从小到大推 f[i]表示从最高层h到第i层所花的最短时间,答案为f[1] 那么显然 f[i] = f[j] + wait(j) + (j - 1), j > i 也就是说枚举从哪个楼层过来.取最优 wait(j)表示从第j个楼层等待电梯的最短时间. 这个算法应该是正确的,但是时间复杂度很大 有n个电梯,h层的话 枚举i和j要h * h,然后算wait要枚举电梯要n 所以是h * h * n,而题目给的n最大200,h最大10000,肯…