andre_joy

导航

09 2012 档案

hdu 3033
摘要:地址:http://acm.hdu.edu.cn/showproblem.php?pid=3033题意:一个人买商品,必须每个种类的商品至少买一件,同时保证买到的价值尽可能大,如果不能满意,输出Impossible。mark:分组背包的变种,普通分组背包是一个组里面最大取一件,这题是至少取一件。 设计状态dp[i][j]代表前i组容量为j的最大价值。由于一组里面有多个物品,所以状态转移可以是前一组少取一个,即dp[i-1][p-g[i][j].v]+g[i][j].w,也可以是当前组之前去过的少取一种,即dp[i][p-g[i][j].v]+g[i][j].w。 网上有些解题报告是... 阅读全文

posted @ 2012-09-28 21:41 andre_joy 阅读(373) 评论(0) 推荐(0)

poj 1837
摘要:地址:http://poj.org/problem?id=1837题意:一个天枰,左边右边总共有n个钩子,总共有m个砝码,要求钩子可以不全用,砝码必须全用的所有方案数。mark:这题可以这样想,每一个砝码挂在每一个位置有一个权值,那么就组成了一个m*n的矩阵,然后需要在每一行里面选出一个使得最后权值和为0,则转移方程为dp[i][pos[j]*w[i]+k] = dp[i-1][k]。因为这里面权值可能有负数,而最大可能是-15*25*20 = -7500,所以数组可以把7500当0用。代码:#include <stdio.h>#include <string.h>#i 阅读全文

posted @ 2012-09-26 19:36 andre_joy 阅读(142) 评论(0) 推荐(0)

hdu 1712
摘要:地址:http://acm.hdu.edu.cn/showproblem.php?pid=1712题意:复习课程,n们课,有m天复习,a[i][j]代表用j天来复习第i门课的收获。。(这里居然可能用的天数多而收获更少……囧)mark:第一个分组背包。对于每个i最多只能选一个j,或者不选。代码:#include <stdio.h>#include <string.h>#include <stdlib.h>const int N = 110;int w[N],dp[N];int max(int a, int b) {return a > b ? a : b 阅读全文

posted @ 2012-09-26 13:51 andre_joy 阅读(147) 评论(0) 推荐(0)

zoj 3524
摘要:地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4439题意:一个有向带权连通图连着n个商店,每个商店里面有一种商品,每个商品有一个体积和价值。有一个背包,当背包里面装m的东西,每走一米消耗m精力,求最多的价值的情况下最少的消耗。mark:学习大牛的思路http://blog.csdn.net/woshi250hua/article/details/7824773 这题用拓扑排序的好处是,可以确定背包的顺序,因为是图,边很多,直接背包,完全没法做。排好序后,可以每个点先根据父亲节点更新一次,然后再完全背包一次。 ... 阅读全文

posted @ 2012-09-25 20:10 andre_joy 阅读(195) 评论(0) 推荐(0)

zoj 3623
摘要:地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4769题意:输入n,l,n代表有n种船可以造,l代表怪物的血量。再输入n行,每行两个数,分别代表造船的时间和船的攻击力,船造好之后可以一直攻击敌人,求打死敌人的最短时间。mark:这居然是个完全背包的题。真的是没想到,看解题报告看了好久才看懂。 把每条船时间当成体积,攻击力当成价值,dp[j]存放时间j最多能打敌人多少血。dp[j] = max(dp[j], dp[j-v[i]]+(j-v[i])*w[i]); 分析:这个转换的时候可以这样理解,后面加的(j-v... 阅读全文

posted @ 2012-09-25 10:49 andre_joy 阅读(399) 评论(0) 推荐(0)

poj 3260
摘要:地址:http://poj.org/problem?id=3260题意:有Vi种硬币,每个硬币有Ci个,要付的价钱T,付多了,老板会找钱,用已有的硬币种类找,求给的和找的硬币数量最少的方案。mark:多重背包,可以参照我的另外一篇日志http://www.cnblogs.com/andre0506/archive/2012/09/22/2697788.html来优化,效率是O(NV)。 这种方法必须排序!代码:#include <stdio.h>#include <string.h>#include <stdlib.h>typedef struct{ int 阅读全文

posted @ 2012-09-24 12:14 andre_joy 阅读(366) 评论(0) 推荐(0)

小结论(2)
摘要:处理背包问题时,经常会遇到体积跟价值相等的情况,比如硬币分类问题。那么我们常常用的状态dp[i]代表体积最大为i时对应的最大价值就是一个无用状态了,因为如果i能够达到,那么最大价值也一定是i。所以dp[]可以选择别的含义,比如用的硬币最多,等等…… 阅读全文

posted @ 2012-09-22 10:14 andre_joy 阅读(103) 评论(0) 推荐(0)

poj 1787
摘要:地址:http://poj.org/problem?id=1787题意:分硬币,有1,5,10,25四种硬币,给定每种硬币的数量,给定要组合成的价值,问刚好达到价值时用的硬币最多的情况。mark:多重背包!本题给出两种方法,特别注意下面一个方法!!!代码:需要回溯,于是就加一个path[]存放父亲,dp[]代表个数。由于该题有5,10这两个硬币,多重背包二进制优化的时候可能出现5*2,然后本题要区分开来,所以记录一下就行。#include <stdio.h>#include <string.h>#include <stdlib.h>const int N = 阅读全文

posted @ 2012-09-22 10:12 andre_joy 阅读(556) 评论(0) 推荐(0)

poj 3181
摘要:地址:http://poj.org/problem?id=3181题意:类似分硬币,给n,m,钱是n,有m中硬币,分别是1~m,求多少种分法mark:普通的完全背包不行,会超long long,需要一点高精度的技巧,会大数加法就没问题了。代码:#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <iostream>#include <algorithm>#include <map>#define LL lon 阅读全文

posted @ 2012-09-21 20:14 andre_joy 阅读(163) 评论(0) 推荐(0)

小结论(1)
摘要:普通的完全背包和母函数是dp递推过程的两个经典对等例子。一个是填表法,完全背包就属于这一类,对于每个状态i,计算dp[i]。一个是刷表法,母函数就是,对于每个状态i,更新dp[i]能够到达的状态。 阅读全文

posted @ 2012-09-21 18:53 andre_joy 阅读(107) 评论(0) 推荐(0)

uva 674
摘要:地址:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=615题意:有1,5,10,25,50这五种硬币。给一个价值,求有多少种组合可以得到该价值。mark:完全背包。代码:最近学习一些大牛设计状态的思路,首先想到了用dp[i][0]代表体积为i最多的价值,dp[i][1]代表体积为i最多的方法。#include <cstdio>#include <cstring>#include <cstdlib&g 阅读全文

posted @ 2012-09-21 17:04 andre_joy 阅读(502) 评论(0) 推荐(0)

hdu 2126
摘要:地址:http://acm.hdu.edu.cn/showproblem.php?pid=2126题意:n种物品,给每种物品的价格,自己的钱m,求在满足买的最多个数情况下有几种方案。mark:01背包扩展一下,三维,dp[i][j][k]代表前i种物品,买j个,价值最多为k时的方案数。递推关系式很容易得到。 这是本题排名第一的大牛的博客http://blog.csdn.net/haha593572013/article/details/7869411 之所以可以根据他的第二种方法设计状态,即dp[i][0]代表用最多用i的钱购买数量最多的物品,dp[i][1]代表在购买最多物品的情... 阅读全文

posted @ 2012-09-20 21:51 andre_joy 阅读(467) 评论(3) 推荐(0)

hdu 3466
摘要:地址:http://acm.hdu.edu.cn/showproblem.php?pid=3466题意:买东西,每个东西有三个特征值,p代表价格,q代表你手中钱必须不低于q才能买这个物品,v代表得到的价值。mark:又是变种01背包,每做一个变种的,就是一种提高。。 这题因为涉及到q,所以不能直接就01背包了。因为如果一个物品是5 9,一个物品是5 6,对第一个进行背包的时候只有dp[9],dp[10],…,dp[m],再对第二个进行背包的时候,如果是普通的,应该会借用前面的dp[8],dp[7]之类的,但是现在这些值都是0,所以会导致结果出错。于是要想到只有后面要用的值前面都可以得到,那.. 阅读全文

posted @ 2012-09-20 19:52 andre_joy 阅读(892) 评论(0) 推荐(0)

poj 2184
摘要:地址:http://poj.org/problem?id=2184题意:有很多羊,每只羊有一个幽默度和智商,要选出一些羊,智商加幽默度总和最大,其中智商总和和幽默度总和都不能是负数。mark:变种的01背包,可以把幽默度看成体积,智商看成价值,那么就转换成求体积和价值都为正值的最大值的01背包了。 由于有负数,所以可以每个体积+1000,然后开一个数组记录用该体积得到最大值时用了多少个1000.代码:#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#incl 阅读全文

posted @ 2012-09-19 18:39 andre_joy 阅读(1259) 评论(0) 推荐(1)

hdu 2955
摘要:地址:http://acm.hdu.edu.cn/showproblem.php?pid=2955题意:抢银行,给出每一个银行的钱和被抓的概率,被抓的总概率低于p才能顺利逃脱,求最多偷多少钱。mark:01背包的转换,需要把偷的钱当作w来考虑。代码:#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <iostream>#include <algorithm>#include <map>#define LL 阅读全文

posted @ 2012-09-19 15:04 andre_joy 阅读(131) 评论(0) 推荐(0)

UVa 624
摘要:地址:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=565题意:背包问题,最多装多少。mark:本题要求输出装的每一个价值,需要回溯一下,必须用二维的。代码:#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <iostream>#include <algori 阅读全文

posted @ 2012-09-19 11:42 andre_joy 阅读(154) 评论(0) 推荐(0)

hdu 4293
摘要:地址:http://acm.hdu.edu.cn/showproblem.php?pid=4293题意:一行人行走,分成很多组,每个人要说出他前面和后面分别有多少个人,他自己团队的人可以忽略,问最多有多少人说真话了。mark:学习了大牛的思路,真是没话说。。想不到……大牛的思路是dp[i][j]代表前i个人并且i+1到j个人是一个团队的时候,最多有多少人说真话。 http://blog.csdn.net/taozifish/article/details/7985044 我在研究了他的代码之后,发现代码可以优化,优化之后顿时有一种豁然开朗的感觉,我知道为什么会这样想了。 dp[i]... 阅读全文

posted @ 2012-09-17 20:34 andre_joy 阅读(169) 评论(0) 推荐(0)

hdu 4291
摘要:地址:http://acm.hdu.edu.cn/showproblem.php?pid=4291题意:g(n) = 3*g(n-1)+g(n-2),求g(g(g(n)))。mark:本地打表找循环节。。。囧,第一次做这种题。找到后直接快速幂。代码:#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <iostream>#include <algorithm>#include <map>#define LL 阅读全文

posted @ 2012-09-16 22:03 andre_joy 阅读(268) 评论(0) 推荐(0)

hdu 4284
摘要:地址:http://acm.hdu.edu.cn/showproblem.php?pid=4284题意:给出一些城市,从1出发,旅游一圈回到1,由于花费可能不够,所以选择一些城市打工,打工之前需要花费d买一个证,工资为c。选中的城市必须去工作一次,而且只能工作一次,问能不能完成旅行mark:先用floyd预处理,记住一定要把断点放在最外层循环!!!状态压缩dp。代码:#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <iostream& 阅读全文

posted @ 2012-09-12 16:44 andre_joy 阅读(99) 评论(0) 推荐(0)

hdu 4283
摘要:地址:http://acm.hdu.edu.cn/showproblem.php?pid=4283题意:一些人排好序,然后先进黑屋子,然后再出来去舞台,黑屋子是相当于一个栈,先进后出,每个人去舞台都有一个不开心值,求不开心值最小的做法。mark:记忆化搜索。代码:#include <cstdio>#include <cstring>#include <cstdlib>int min(int a, int b) {return a < b ? a : b;}const int INF = 10000000;int d[110], sum[110][110 阅读全文

posted @ 2012-09-11 21:56 andre_joy 阅读(332) 评论(0) 推荐(0)

hdu 4281
摘要:地址:http://acm.hdu.edu.cn/showproblem.php?pid=4281题意:有n个任务等待完成,每个任务有位置,所需时间,每个人最多m分钟。 第一问是求这些任务最少几个人完成;第二问是给无数个人,问最少需要多少分钟完成所有任务,并且每个人上限还是m。mark:第一问可以状态dp,可以01背包记录一下,然后回溯。 第二问参见了大牛的做法,先状态dp,然后暴力搜索一下。 今天才了解到状态压缩dp可以有两种方式写,第一种是从前往后扫一遍,每次转换这个状态能够到达的状态(因为状态肯定是由值小的到值大的) 第二种是用队... 阅读全文

posted @ 2012-09-11 11:49 andre_joy 阅读(243) 评论(0) 推荐(0)