
ACM_动态规划_背包
文章平均质量分 57
kthsdwwl
这个作者很懒,什么都没留下…
展开
-
hdu 2639 Bone Collector II
题目链接: 点击打开链接题目大意: 背包装骨头,求第k大的骨头价值思路: 动态规划,01背包分析: 01背包变形,求第k大的价值。那么dp数组每个单元存的就不是当前状态最优价值了,而是一个长度为k的序列,存放前k个骨头价值。状态转换时,对于某块骨头如果放,那么将dp[j-vol[i]]的序列中的所有值加上val[i];如果不放,保持原样。将这两个序列合并排序取前原创 2013-12-06 15:41:21 · 435 阅读 · 0 评论 -
poj 1276 Cash Machine
#include #include #include using namespace std;const int maxc = 100000 + 10;const int maxn = 20;int V, n, cost[maxn], amount[maxn], dp[maxc];void ZeroOnePack(int cost, int value){ for (int原创 2013-12-11 18:57:42 · 356 阅读 · 0 评论 -
poj 2184 Cow Exhibition
题目链接: 点击打开链接题目大意: 选牛,要求smart值和fun值总和最高且总smart和总fun值都不能为负数思路: 动态规划,01背包分析: 可以以smart作为体积,fun作为价值来考虑。状态转换方程:dp[j]=max{dp[j], dp[j-s[i]+f[i]}。dp结束后寻找大于等于0的体积,计算体积和价值总和,求得一个最大值。由于smar原创 2013-12-05 16:38:31 · 404 阅读 · 0 评论 -
uva 562 Dividing coins
题目链接: 点击打开链接题目大意: 一堆硬币两个人分,要求差值最小思路: 动态规划,01背包分析: 01背包,把所有硬币面值相加除2得中值,把这个中值当成背包容量,算出在不超过它的情况下最多能拿多少钱,最后用总额减一下就成了。代码: #include #include #include #include using namespace s原创 2013-12-04 14:46:11 · 463 阅读 · 0 评论 -
hdu 2191
题目链接: 点击打开链接题目大意: 买米,给定总钱数,每种米的价格,重量,数量,问能买到的最大重量是多少思路: 动态规划,多重背包分析: 多重背包入门题,直接套模板代码:#include #include #include using namespace std;const int maxm = 100 + 10;const int原创 2013-12-11 18:35:13 · 372 阅读 · 0 评论 -
hdu 1059 Dividing
题目链接: 点击打开链接题目大意: 分弹珠思路: 动态规划,多重背包分析: 多重背包问题,第一次没优化超时了,根据背包问题九讲上的叙述稍微优化了一下,过了。先把每种物品分成若干个物品,每个物品有一个系数,1,2,4... . ,每个物品的重量和价值是原本的值乘上这个系数,这样就转化成一个01背包问题,接着就好办了。代码:#include #in原创 2013-12-11 17:04:56 · 446 阅读 · 0 评论 -
hdu 2955 Robberies
题目链接: 点击打开链接题目大意: 小偷抢银行,被抓概率低于限度的情况下要求金钱最多思路: 动态规划,01背包分析: 由于被抓概率是小数,没法将这个参数当做背包容量,因此换个思路,把所有银行总金额当做背包总量,每个银行金额当做体积,不被抓的概率当做价值,目标是不被抓的概率最大,最后看在什么金额下不被抓概率符合要求即可。代码:#include #原创 2013-12-04 16:59:11 · 441 阅读 · 0 评论 -
poj 3181 Dollar Dayz
题目链接: 点击打开链接题目大意: 有不同价值的工具和一定数额的钱,问买工具的方案有多少思路: 动态规划,完全背包分析: 完全背包求方案问题,答案会超出long long,因此dp结果分开用两个数组dph,dpl存,dpl存放结果的低18位,dph存放高位。最后依次输出两个数组的结果。如果低位不足18位,在前面补0。代码:#include #i原创 2013-12-09 16:15:23 · 686 阅读 · 0 评论 -
uva 674 Coin Change
题目链接: 点击打开链接题目大意: 给定一个面额,求将这个面额换算成硬币的方案数。思路: 动态规划,完全背包分析: 完全背包基础题,用一维数组dp[j]存放当面额为j时的方案数,状态转移方程可以这么理解:dp[i][j] = dp[i-1][j] + dp[i][j - coins[p]]。代码:#include #include using原创 2013-12-08 17:39:28 · 1154 阅读 · 0 评论 -
uva 147 Dollars
题目链接: 点击打开链接题目大意: 给定一个面额,求将这个面额换算成硬币的方案数。硬币有美元美分两种,面额不超过$300.00。思路: 动态规划,完全背包分析: 和uva 647思路一样,不过需要换算一下,注意答案会超出int范围,得用long long存。代码:#include #include using namespace std;原创 2013-12-09 14:57:06 · 454 阅读 · 0 评论 -
hdu 2546 饭卡
题目链接: 点击打开链接题目大意: 饭卡余额m元,从n道菜中选,使得饭卡余额尽量低,也就是花费尽量高。余额小于5元是买不了菜的,不低于5元的话就算透支也没事思路: 动态规划,01背包分析: 就是个01背包题,不过得做点变通。用一维数组dp存放子状态结果,dp[j]表示余额为j时最高的花费。那么dp[0]到dp[4]就永远都是0了。考虑到透支是可以的,所以在状态转原创 2013-12-01 19:58:54 · 413 阅读 · 0 评论 -
hdu 2602 Bone Collector
题目链接: 点击打开链接题目大意: 思路: 01背包,dp分析: 常规01背包题,一维数组代码:#include #include #include using namespace std;const int maxn = 1000 + 10;const int maxv = 1000 + 10;int n, v;int dp[原创 2013-12-01 16:20:18 · 443 阅读 · 0 评论 -
uva 624 cd
题目链接: 点击打开链接题目大意: 把cd里的歌转移到总长度为n的磁带中,要求能尽可能多地利用磁带空间。最后除了输出总长度,还要依次输出选择的歌曲的长度。思路: 动态规划,01背包分析: 01背包,要记录中间结果,我使用了vector数组来记录。#include #include #include using namespace std;con原创 2013-12-02 14:15:47 · 485 阅读 · 0 评论 -
poj 1384 Piggy-Bank
题目链接: 点击打开链接题目大意: 给定重量上限,求刚好填满这个上限的所有硬币的最小价值。思路: 动态规划,完全背包分析: 完全背包基础题,用一维数组,先遍历所有种类的硬币,接着从小到大遍历重量,转移方程为 dp[i][j] = min( dp[i-1][j], dp[i][j-weight[i] ] + value[i] )。代码:#incl原创 2013-12-07 16:21:58 · 379 阅读 · 0 评论 -
poj 3260 The Fewest Coins
题目链接: 点击打开链接题目大意: Farmer John买东西,要求付的金币数加找回的金币数总和最小思路: 动态规划,多重背包,完全背包分析: John的金币数是有限的,我们可以用多重背包算给定数额下John最少能付多少金币。卖家金币数是无限的,我们可以用完全背包算给定找钱数下卖家最少能付多少金币。最后遍历两个dp数组,算出最小的金币数就行了。我用dp_rec原创 2013-12-16 19:46:33 · 725 阅读 · 0 评论