![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
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 · 412 阅读 · 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 · 334 阅读 · 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 · 375 阅读 · 0 评论 -
uva 562 Dividing coins
题目链接: 点击打开链接 题目大意: 一堆硬币两个人分,要求差值最小 思路: 动态规划,01背包 分析: 01背包,把所有硬币面值相加除2得中值,把这个中值当成背包容量,算出在不超过它的情况下最多能拿多少钱,最后用总额减一下就成了。 代码: #include #include #include #include using namespace s原创 2013-12-04 14:46:11 · 443 阅读 · 0 评论 -
hdu 2191
题目链接: 点击打开链接 题目大意: 买米,给定总钱数,每种米的价格,重量,数量,问能买到的最大重量是多少 思路: 动态规划,多重背包 分析: 多重背包入门题,直接套模板 代码: #include #include #include using namespace std; const int maxm = 100 + 10; const int原创 2013-12-11 18:35:13 · 351 阅读 · 0 评论 -
hdu 1059 Dividing
题目链接: 点击打开链接 题目大意: 分弹珠 思路: 动态规划,多重背包 分析: 多重背包问题,第一次没优化超时了,根据背包问题九讲上的叙述稍微优化了一下,过了。先把每种物品分成若干个物品,每个物品有一个系数,1,2,4... . ,每个物品的重量和价值是原本的值乘上这个系数,这样就转化成一个01背包问题,接着就好办了。 代码: #include #in原创 2013-12-11 17:04:56 · 424 阅读 · 0 评论 -
hdu 2955 Robberies
题目链接: 点击打开链接 题目大意: 小偷抢银行,被抓概率低于限度的情况下要求金钱最多 思路: 动态规划,01背包 分析: 由于被抓概率是小数,没法将这个参数当做背包容量,因此换个思路,把所有银行总金额当做背包总量,每个银行金额当做体积,不被抓的概率当做价值,目标是不被抓的概率最大,最后看在什么金额下不被抓概率符合要求即可。 代码: #include #原创 2013-12-04 16:59:11 · 419 阅读 · 0 评论 -
poj 3181 Dollar Dayz
题目链接: 点击打开链接 题目大意: 有不同价值的工具和一定数额的钱,问买工具的方案有多少 思路: 动态规划,完全背包 分析: 完全背包求方案问题,答案会超出long long,因此dp结果分开用两个数组dph,dpl存,dpl存放结果的低18位,dph存放高位。最后依次输出两个数组的结果。如果低位不足18位,在前面补0。 代码: #include #i原创 2013-12-09 16:15:23 · 656 阅读 · 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 · 1124 阅读 · 0 评论 -
uva 147 Dollars
题目链接: 点击打开链接 题目大意: 给定一个面额,求将这个面额换算成硬币的方案数。硬币有美元美分两种,面额不超过$300.00。 思路: 动态规划,完全背包 分析: 和uva 647思路一样,不过需要换算一下,注意答案会超出int范围,得用long long存。 代码: #include #include using namespace std;原创 2013-12-09 14:57:06 · 430 阅读 · 0 评论 -
hdu 2546 饭卡
题目链接: 点击打开链接 题目大意: 饭卡余额m元,从n道菜中选,使得饭卡余额尽量低,也就是花费尽量高。余额小于5元是买不了菜的,不低于5元的话就算透支也没事 思路: 动态规划,01背包 分析: 就是个01背包题,不过得做点变通。用一维数组dp存放子状态结果,dp[j]表示余额为j时最高的花费。那么dp[0]到dp[4]就永远都是0了。考虑到透支是可以的,所以在状态转原创 2013-12-01 19:58:54 · 393 阅读 · 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 · 423 阅读 · 0 评论 -
uva 624 cd
题目链接: 点击打开链接 题目大意: 把cd里的歌转移到总长度为n的磁带中,要求能尽可能多地利用磁带空间。最后除了输出总长度,还要依次输出选择的歌曲的长度。 思路: 动态规划,01背包 分析: 01背包,要记录中间结果,我使用了vector数组来记录。 #include #include #include using namespace std; con原创 2013-12-02 14:15:47 · 466 阅读 · 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 · 357 阅读 · 0 评论 -
poj 3260 The Fewest Coins
题目链接: 点击打开链接 题目大意: Farmer John买东西,要求付的金币数加找回的金币数总和最小 思路: 动态规划,多重背包,完全背包 分析: John的金币数是有限的,我们可以用多重背包算给定数额下John最少能付多少金币。卖家金币数是无限的,我们可以用完全背包算给定找钱数下卖家最少能付多少金币。最后遍历两个dp数组,算出最小的金币数就行了。我用dp_rec原创 2013-12-16 19:46:33 · 698 阅读 · 0 评论