andre_joy

导航

上一页 1 2 3 4 5 6 7 ··· 15 下一页

2012年10月2日

小结论(3)

摘要: 分组背包的学习结束了,收获颇多,分组背包是个很神奇的东西。分组背包经常一般是三种情况。(1)每组物品最多选一个(最常规的)for(i = 0; i < n; i++) //n是总共种类 for(j = vmax; j >= 0; j--) //vmax是背包最大容量 for(k = 0; k < num[i]; k++) //num[]为该类物品个数 if(j >= v[k]) dp[j] = max(dp[j], dp[j-v[k]+w[k]]);这是一维的情况,二维很容易扩展,接下来两种题目必须用二维。而且用到用到01背包里面恰好到达的概念,必须... 阅读全文

posted @ 2012-10-02 01:52 andre_joy 阅读(150) 评论(0) 推荐(0) 编辑

hdu 3535

摘要: 地址:http://acm.hdu.edu.cn/showproblem.php?pid=3535题意:混乱背包,s=0,至少选一种,s=1,最多选一种,s=2,随意选。mark:分别三种情况背包。初始化的时候不能直接把dp[i-1][j]赋值给dp[i][j],必须取最大值。代码:#include <stdio.h>#include <string.h>#include <stdlib.h>const int N = 110;int n,t,m,s;int v[N],w[N];int dp[N][N];int i,f;int max(int a, int 阅读全文

posted @ 2012-10-02 01:37 andre_joy 阅读(151) 评论(0) 推荐(0) 编辑

2012年10月1日

hdu 3810

摘要: 地址:http://acm.hdu.edu.cn/showproblem.php?pid=3810题意:dota里面敌法师有一个技能blink,就是瞬间移动,而且没有CD。给定很多地方,有些距离比较近的地方是可以相互瞬间移动到的,问能否在达到给定金钱,并求出最小时间。mark:本题把能够相互到达的可以看成一部分,那么就分成很多部分,每个部分没有任何联系,相互做一次01背包,取最小值就好的。 但是问题的关键是本题数据很大,背包容量最大是10亿,时间虽然是30s,但是直接扫肯定是不行的,本来我们是可以用队列的方式解普通的01背包,但是我们用队列跟直接用数组花费空间是一样大的,所以我们需要想办... 阅读全文

posted @ 2012-10-01 19:06 andre_joy 阅读(305) 评论(0) 推荐(0) 编辑

zoj 3644

摘要: 地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4834题意:一个有向图,从1出发,到n,初始分数是位置1的分数,每走一步,分数变为之前分数跟当前位置分数的最小公倍数,题目规定每走一步分数必须变化。求多少种方案走到n达到分数k。mark:用bfs做的。正在处于学习STL阶段,写了很长时间。代码:#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <iostream 阅读全文

posted @ 2012-10-01 11:59 andre_joy 阅读(272) 评论(0) 推荐(0) 编辑

2012年9月28日

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 阅读(359) 评论(0) 推荐(0) 编辑

2012年9月26日

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 阅读(137) 评论(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 阅读(138) 评论(0) 推荐(0) 编辑

2012年9月25日

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 阅读(184) 评论(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 阅读(393) 评论(0) 推荐(0) 编辑

2012年9月24日

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 阅读(350) 评论(0) 推荐(0) 编辑

上一页 1 2 3 4 5 6 7 ··· 15 下一页