随笔分类 -  背包

摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1059题意: 给出价值分别为1-6的东西 , 输入代表价值为1-6的个数 , 现在问你将这些东西完全平分成两份 , 看能不能刚好平分.坑爹: 我一开始是想用多重背包算出 DP[sum] 然后在看下 DP[sum/2] 是不是刚好是sum的一半 , 但这样会超时解法: 用多重背包 把背包的 "体积" 定为总价值的一半就是行了 , 不需要算到 "体积" 为sum .View Code 1 #include<iostream> 2 using namespace 阅读全文
posted @ 2012-09-30 22:35 pc.... 阅读(204) 评论(0) 推荐(0)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1171题意: 给定你每种设备的价值和数量 , 要你将这些设备平分( 就算不是刚好平分也要尽量接近).坑爹: 一开始看到这题是一点思路都没有 , 以为一定要刚好平分 . 数组要开到 50 * 50 * 100 .解法: 只要将所有设备的价值加起来(sum) , 然后利用多重背包 , 但"背包"的容量不是sum , 而是sum/2 , 这样就可以找出当"背包"的容量为总价值一半的时候的最优情况 , 然后另外一边分到的设备就是 sum - DP[sum/2] .View Co 阅读全文
posted @ 2012-09-15 19:22 pc.... 阅读(185) 评论(0) 推荐(0)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1114题意: 有T组测试数据,后面的E和F分别表示存钱罐空的时候的重量和满了的时候的重量 , 然后有个m ,代表下面有 m 种钱币 , 每种钱币分别有他的面值和重量 , 要你求出当存钱罐满的时候 , 存钱罐中至少有多少钱.坑爹: 因为他是要求出最少有多少钱 , 所以要 DP[ j ] = min ( DP [j ] , DP[ j - cost ] + weight )还有一点要注意的是DP数组的初始化 , 要初始化为最大值 , 因为它每次都要求最小的一种情况 , DP[0] = 0是递推的一个开始.解法.. 阅读全文
posted @ 2012-09-15 17:45 pc.... 阅读(264) 评论(4) 推荐(0)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1028题意: 给你个数N,要你拆分成很多个数字的和。坑爹: 但不能出现 4 = 3 + 1 和 4 = 1 + 3 这样是算重复的。解法: 每次对一个数N进行 ( 1 - N)的放与不放的试探, 比如说5,不放5的最优解就是在与现在相同负重的时候放了4的解,放5分就等于 f [j-5] + weight 这两种情况加起来就是 5 的最优情况。View Code 1 #include<iostream> 2 using namespace std; 3 4 const int maxn = 120 阅读全文
posted @ 2012-09-13 11:23 pc.... 阅读(200) 评论(0) 推荐(0)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=2159题意: 给出的n , m , k ,s 分别代表还需n经验升级、还有m耐久度、下面有k组数据、最多能杀s只怪,下面k组的a和b分别代表杀一只这种怪要消耗b耐久度获得a经验,让你计算出在耐久度和杀怪数范围内能不能获得题目给出的经验。坑爹: 一开始我想的时候以为是多重背包的问题,我以为是每种怪都能杀s次,其实是总共只能杀s只怪,所以不能用多重背包做。解法: 二维费用的背包问题,用一个DP的二维数组,DP[ i][ j] i 代表杀怪数 , j 代表耐久度 。因为每个怪可以打多次,所以Pack函数里的循... 阅读全文
posted @ 2012-09-13 11:04 pc.... 阅读(303) 评论(0) 推荐(0)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=2191题意: 给出大米的价格、重量和袋数,要你计算出在规定的钱数内买最多(重)的米。坑爹: 算是多重背包问题的模版题吧。解法: 多重背包。View Code 1 #include<iostream> 2 using namespace std; 3 4 const int maxn = 20000 + 10; 5 int n; 6 int DP[maxn]; 7 8 int max(int a,int b) 9 {10 return a > b ? a : b;11 }12 13 void. 阅读全文
posted @ 2012-09-12 15:21 pc.... 阅读(184) 评论(0) 推荐(0)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1284题意: 给个整数N(分),只能用1分,2分,3分,进行兑换,计算出有多少种兑换方法。坑爹: 简单的完全背包。解法: 当前的兑换方法 f [ j]等于放入某一种钱币和没放入某一种钱币之和,放入某种钱币又分放了多少个,将放了1到最多个的方法加起来就是放入某种钱币之和。View Code 1 #include<iostream> 2 using namespace std; 3 4 const int maxn = 32768 + 10; 5 const int INF = -1 * 0x7fff 阅读全文
posted @ 2012-09-11 21:15 pc.... 阅读(169) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=2184题意: 第一行为N,代表下面有N组数据,下面每一行有S和F分别代表一头牛的智商和幽默度(有正有负),现在要你算出要选哪些牛,是求当智商大于0时,幽默度最大的时候的智商与幽默度的总和,总和如果为负的话输出0,正的话直接输出总和的值。坑爹: 因为这相当于01背包的问题了,智商为背包中的体积,幽默度为背包中的价值,但是智商可能为负,访问数组下标的时候会错误。 初始化要将 数组 f 赋值为 -0x3fffffff(其实-200000就够了)并把f[1000000] = 0 因为幽默度能可能出现负数。解法: 要解决数组下标可能会访问到负... 阅读全文
posted @ 2012-09-10 17:15 pc.... 阅读(202) 评论(0) 推荐(0)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=2955题意: 第一行第一个小数,是这个人被抓住的概率最大不能超过这个数,第二个是有N个银行。一个整数和小数分别为这个银行有多少钱和被这个银行抓住的概率。求出这个小偷在不超过自己抓住的最大概率中抢更多的银行。坑爹: f 数组 初始化为0 ,但是 f [0] 要为1,因为不抢任何银行的时候永远是成功的。所有银行的钱数加起来是“背包”的容量,不被抓的概率是价值。解法: 套用01背包的状态转移方程,解出不被抓住的概率,然后用1减去它,再和被抓住的概率比较。View Code 1 #include<iostre. 阅读全文
posted @ 2012-09-06 16:40 pc.... 阅读(188) 评论(0) 推荐(0)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=2546题意: 给你一些饭菜的价格,和你饭卡的余额,余额大于等于5元时可以刷任何价格的菜,算出你买了这些菜之后饭卡中最少的一组解(余额可以为负)。坑爹: 这道题中,他的价格也就是背包中的容量,也是背包中的价值,总余额如果超出5元要将总余额减去5元的钱尽量用掉。 解法 用到了一点贪心的思想,用一个sort排序,将便宜的菜买了,尽量将饭卡里的余额靠近5元,然后在买一个最贵的菜,这样就会让饭卡里的余额最少了。View Code 1 #include<iostream> 2 #include<algo 阅读全文
posted @ 2012-09-05 20:57 pc.... 阅读(201) 评论(0) 推荐(0)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1203题意: 一道01背包的水题,每一行分别是申请所需的费用和被录取的概率,Speakless只有一定的钱,要在这些规定的钱内找到至少能被一所学校录取的概率的最大值。坑爹: 才刚开始看01背包问题,对初始化的的操作不是很清楚,而且这个在计算f[n]的时候要尽量的小,而达到1-f[n]最大。解法: 套用01背包的公式,而且将 f 数组全部初始化为1,从而保证没有一所学校录取的时候 1 - f [n] 为 0.View Code 1 #include<iostream> 2 using namespa 阅读全文
posted @ 2012-09-05 20:00 pc.... 阅读(161) 评论(0) 推荐(0)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=2602题意: 给你N根骨头,分别有它们的价值和体积,他的袋子有规定最多能装多少体积的骨头,需要你求出他收集的骨头的总体积不超过他的袋子的情况下算出袋子中骨头价值最高的一个解。坑爹: 今天才刚看 01背包 ,现在也不是太明白吧,这题是水题,只要套下公式就出来了。解法: 用01背包那个状态转移方程(资料上复制的伪代码)for i=1..N for v=V..0 f[v]=max{f[v],f[v-c[i]]+w[i]};View Code 1 #include<iostream> 2 using na 阅读全文
posted @ 2012-09-05 10:43 pc.... 阅读(197) 评论(0) 推荐(0)