背包
文章平均质量分 58
Sleppypot
困难的路越走越容易,容易的路越走越难。
展开
-
完全背包基础
题目:hdu1114 题意:一个背包,求装满状态下能乘的最小价值 解答:完全背包~~~ //完全背包 #include #include #include #include #include using namespace std; const int maxn = 550; const int MAXN = 10010; const int INF = 0x3f3f3f3f; struct原创 2016-09-15 10:50:08 · 288 阅读 · 0 评论 -
0/1背包变化
题目:poj1837 题意:有一个天平,天平左右两边各有若干个钩子,总共有C个钩子,有G个钩码,求将钩码全部挂到钩子上使天平平衡的方法的总数。其中可以把天枰看做一个以x轴0点作为平衡点的横轴。 解答:dp[i][j]表示放入前i个钩码平衡度为j的种数。因为数组下标不能为负数所以把-7500到7500平移到0到15000.状态转移方程见下表。 #include #include #includ原创 2016-09-01 20:29:31 · 293 阅读 · 0 评论 -
普通01背包
题目:hdu1864 题意:现有一笔经费可以报销一定额度的发票。允许报销的发票类型包括买图书(A类)、文具(B类)、差旅(C类),要求每张发票的总额不得超过1000元,每张发票上,单项物品的价值不得超过600元。现请你编写程序,在给出的一堆发票中找出可以报销的、不超过给定额度的最大报销额。 解答:普通的01背包问题。需要注意的是输入! #include #include #include #原创 2016-12-03 01:09:31 · 327 阅读 · 0 评论 -
01背包变化3
题目:hdu2546 题意:电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额。如果购买一个商品之前,卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上余额为负),否则无法购买(即使金额足够)。所以大家都希望尽量使卡上的余额最少。 某天,食堂中有n种菜出售,每种菜可购买一次。已知每种菜的价格以及卡上的余额,问最少可使卡上的余额为多少。 解答:如果m #includ原创 2016-09-02 22:22:40 · 488 阅读 · 0 评论 -
01背包变化4
题目:hdu5544 题意:给一个长度为L的平台,和n根金条的长度与价值,金条只能在平台上摆一长条,且每根金条的重心不能超出平台边缘。 解答:01背包dp加一维表示当前物品与之前物品已经占用了多少个边缘。 dp[k][i][v]: 第一维:k=0,1,2。0代表没有半截的情况,1代表有1个半截的情况,2代表有2个半截的情况。 第二维:前i物品。 第三位:占了v容量。原创 2016-09-04 17:17:00 · 288 阅读 · 0 评论 -
二维费用的背包问题
题目:toj3596 题意:有N张光盘,每张光盘有一个价钱,现在要从N张光盘中买M张,预算为L,每张光盘有一个快乐值,要求在不超过预算并且恰好买M张,使得快乐值最大。 解答:典型的二维费用背包问题,另外一种隐含的费用为个数,每个物品的个数费用为1。要求恰好买M张表示要求恰好装满,所以初始化不是0,而是-INF。 二维背包的状态转移方程:F[i, v, u] = max{F[i − 1, v,原创 2016-10-14 22:10:36 · 4550 阅读 · 1 评论 -
多重背包基础
题目:hdu1171 题意:把一个多重背包尽可能地分成相等的两份。 解答:背包的总乘重为所有重量的一半,然后尽可能地接近这个总乘重就好。 //多重背包 #include #include #include using namespace std; const int MAXN = 300000; int dp[MAXN]; int N,W; int value[55],num[55]; vo原创 2016-09-21 16:13:04 · 386 阅读 · 0 评论 -
二维完全背包
题目:hdu2159 题意:xhd升掉最后一级还需n的经验值,xhd还留有m的忍耐度,每杀一个怪xhd会得到相应的经验,并减掉相应的忍耐度。当忍耐度降到0或者0以下时,xhd就不会玩这游戏。xhd还说了他最多只杀s只怪。请问他能升掉这最后一级吗。 解答:把忍耐度看成容量,经验值看成是价值。由于限制了放入物品的个数,所以这是一个二维的完全背包问题。dp[j][w]表示用了j的忍耐值、杀了w个怪的原创 2016-09-18 11:01:31 · 2032 阅读 · 0 评论 -
01背包与完全背包结合
题目:hdu5410 题意:一个物品重量W,告诉你总的物品时数和总钱数。买x个会给a*x+b个蜡烛。问最多可以获得多少个蜡烛。 解答:如果每个物品只拿一个,那就给a+b个蜡烛,所以先01背包再完全背包。 #include #include #include #include #include using namespace std; const int MAXN = 2020; struct原创 2016-09-15 21:03:39 · 351 阅读 · 0 评论 -
01背包变化2
题目:poj2184 题意:给出num(num 解答:把前面那个变量看成背包的容量。后面的值看成背包的价值。由于背包的容量可能为负值,因此需要将其向右平移100000个单位。 #include #include #include #include using namespace std; const int INF = 0x3f3f3f3f; const int MAXN = 110; in原创 2016-09-02 20:57:14 · 307 阅读 · 0 评论