背包类dp
林伏案
妖蛾子良多的范老爷
展开
-
poj1837
/* solution: 背包型dp dp[i][j]表示选到第i个时,平衡度为j的方法数. 转移方程:dp[i][j+C[k]*G[i]] += dp[i][j]; note: 1:注意初始条件的初始化 2:关于该题目中平衡度,因为在极端条件下,左右两边的极限值为:20*25*15=7500 所以极限值范围:-7500~+7500;有由于下标不能为负数,所以将平衡值从0移动为750原创 2016-08-16 20:00:32 · 211 阅读 · 0 评论 -
poj1276
/* solution: 赤裸裸的多重背包dp dp[i]表示能够凑出金额不超过i的最大金额数。 状态转移方程还是按照01背包问题演化而来:dp[i] = max(dp[i], dp[i-c[i]]+w[i])。 只不过在这里重量和价值都看成cash[i]。 note: 注意在按照01背包求解时,循环条件要注意改成k*cash[i]!! date: 2016.8.17 */ #in原创 2016-08-17 20:19:26 · 203 阅读 · 0 评论 -
poj1159(类LCS的转移方程)
/* translation: 给出一串字符串,求最少插入几个字符才能形成回文串。 solution: 基本dp,LCS类转移方程 思路很简单,将原字符串及其反串求LCS,将原本字符串长度减去LCS长度就是答案。 状态定义和转移方程都和LCS一样。 note: 该题目需要用滚动数组,不然会MLE。所以相应的求解方式也作出改变。详见代码。 理解滚动数组求解方式:只要画出网格图来代表原原创 2016-08-20 17:48:08 · 423 阅读 · 0 评论 -
poj1742(多重背包dp)
点击打开链接 /* translation: 给定一些硬币面额以及对应的个数,求用这些硬币可以拼凑成多少种不同数值的金额。 solution: 多重背包dp 这道题必须用多重背包dp的O(nm)复杂度的算法来求解。 设dp[i][j]:前i种拼凑出面值恰好为j时,最多还剩下几个第i种的硬币 先将所有初始化为-1.则dp[i][j]>=0 dp[i+1][j] = c[i]. i<原创 2016-09-02 21:49:38 · 322 阅读 · 0 评论 -
poj3181(高精度完全背包dp)
点击打开链接 /* translation: 给你一定金额n的硬币,再给出k件商品,第i件商品的价格为i。用n金额有多少种购买方案? solution: 完全背包,状态以及转移方程均类似 note: 1:一开始按照完全背包的写法,是错误的。但方法没错,原因在于数据问题,输入边界值1000 100, 输出的是无用的数据。明显发生了数据溢出问题。所以按照网上题解的思路,将其分成两个数组,原创 2016-09-05 16:15:52 · 1452 阅读 · 0 评论 -
poj2392(多重背包dp,可行性类型O(nm)复杂度的解法。)
/* translation: 有k种石块,每种石块有ci个,每种石块所在的高度不能超过ai,求用这k种石头所能达到的最高高度 solution: 多重背包dp可行性解法,贪心 先排序,然后按照多重背包dp可行性解法即可ac note: 此题用常规的多重背包wa了,不知道为啥? date: 2016.9.8 */ #include #include #include #inc原创 2016-09-19 22:07:56 · 531 阅读 · 0 评论 -
poj2184(背包的可行性解法)
/* translation: 有n件物品,每件有两个属性:s[i], f[i]。要求选出一些物品使得在s[i]和f[i]都为非负数情况下二者的和最大是多少? solution: 一维01背包 令dp[i]表示s[i]属性恰好装满到i时,f[i]最大值是多少。由于s[i]有负数存在所以将数组开大。 具体转移方程见代码。 note: 1:这类选与不选的问题很明显用背包,一开始想到的是二原创 2016-09-20 21:42:39 · 252 阅读 · 0 评论 -
hdu1114(完全背包)
/* translation: 给出n种硬币,以及该种硬币的价值和重量。求在已知重量的条件下求出这些硬币的一个组合,使得它们的价值之和最小。 solution: 完全背包dp 按照完全背包dp的解法即可。 note: 1:注意完全背包采用滚动数组的写法时的第二重循环的遍历顺序。和01背包比较。 date: 2016.10.31 */ #include #include #includ原创 2016-10-31 21:50:41 · 388 阅读 · 0 评论 -
uva242(转换成完全背包dp)
/* translation: 一个信封最多能够贴s张邮票,现在有n个邮票的集合,求能够连续覆盖最大的值的邮票的集合。并打印出能够 i连续覆盖的最大的值。 solution: 完全背包dp的可行性解法 设dp[i][j]:=前i种物品能够达到j值的所用最少的张数。然后即可按照完全背包的滚动数组dp来求解。 之后从1开始遍历,一旦遇到所需张数大于s的话,那么所能够连续覆盖的最大的值就是此时原创 2017-01-15 21:01:25 · 718 阅读 · 0 评论