完全背包这里要装满,所以要注意dp初始化:dp[0]=0;当求背包最小值时dp[i]=INF(无穷大) (1<=i<=n);反之 dp[i]= -INF(无穷小) (1<=i<=n);View Code #include<stdio.h>#include<string.h>#include<algorithm>#define INF 1000000000using namespace std;int dp[10003],p[503],w[503];int main(){ int cas,i ,j, m, n, x, y; scanf( Read More
posted @ 2012-08-08 19:54 To be an ACMan Views(204) Comments(0) Diggs(0)
一些二进制的基本知识:判断j是否属于集合i:i&(1<<j)在集合i中去除j:i-(1<<j)或者i&(!(1<<j)) i^(1<<j)在集合i中加入点j:i|(1<<j);先预处理出len[i][j]表示第i个字符串与第j个字符串组合能匹配的最大字符数用一个数的二进制来表示那些字符串,那些字符串还没有选,即二进制位为1 的表示已经选了,为0的表示还没有选Dp[i][j]代表当选取的字符串为i状态,且最后一个选取的字符串是第j个字符串时的最优值状态转移:枚举某个状态时,枚举一个已选的字符串(即当前状态二进制位为1的位 Read More
posted @ 2012-08-08 19:04 To be an ACMan Views(697) Comments(2) Diggs(0)
仔细想一想,必须先要从a_i最小的开始装,这样才能保证高度最高,先根据a_i的大小对每个塔的信息整体进行从小到大排序,然后就是多重背包问题。多重背包不懂的去百度搜《背包九讲》,第4讲就是多重背包,水过。View Code #include<stdio.h>#include<string.h>#include<algorithm>using namespace std;int n;bool dp[40003];struct node{ int a, h, c;}p[43];bool cmp(node a, node b){ return a.a<b.a; Read More
posted @ 2012-08-07 22:51 To be an ACMan Views(215) Comments(0) Diggs(0)
赤裸裸的0-1背包问题,入门题啊View Code #include<stdio.h>#include<string.h>#include<algorithm>using namespace std;int dp[12883];int w[3400],p[3400];int main(){ int n, m, i, j; while(~scanf("%d%d",&n,&m)) { for(i=1;i<=n;i++) scanf("%d%d",&w[i],&p[i]); memset Read More
posted @ 2012-08-07 20:43 To be an ACMan Views(142) Comments(0) Diggs(0)
多重背包看了《背包九讲》,此题1A,爽!!!根据《背包九讲》提供的伪代码:procedure MultiplePack(cost,weight,amount) if cost*amount>=V CompletePack(cost,weight) return integer k=1 while k<num ZeroOnePack(k*cost,k*weight) amount=amount-k k=k*2 ZeroOnePack(amount*cost,amount*weight)自己写一个吧,哈哈... Read More
posted @ 2012-08-07 15:15 To be an ACMan Views(274) Comments(0) Diggs(0)
背包问题九讲 v1.0目录第一讲 01背包问题第二讲 完全背包问题第三讲 多重背包问题第四讲 混合三种背包问题第五讲 二维费用的背包问题第六讲 分组的背包问题第七讲 有依赖的背包问题第八讲 泛化物品第九讲 背包问题问法的变化附:USACO中的背包问题前言本篇文章是我(dd_engi)正在进行中的一个雄心勃勃的写作计划的一部分,这个计划的内容是写作一份较为完善的NOIP难度的动态规划总结,名为《解动态规划题的基本思考方式》。现在你看到的是这个写作计划最先发布的一部分。背包问题是一个经典的动态规划模型。它既简单形象容易理解,又在某种程度上能够揭示动态规划的本质,故不少教材都把它作为动态规划部分的第 Read More
posted @ 2012-08-07 15:10 To be an ACMan Views(263) Comments(0) Diggs(0)
背包DP题意:有一杆秤,秤上有c个挂钩(2<=c<=20)(在左为负,在右为正,范围-15—15),另有g(2<=g<=20)个砝码(质量各不相同,范围1-25),要 求把所有砝码挂到挂钩上能使秤平衡的种数。分析:每个砝码必须放在c个挂钩上的其中一个。用数组dp[i][j](j表示一个状态,力矩+7500)表示放完第i个砝码后,各个状态存在的种数;确定数组范围:显然0<=i<=20,而对于j,取最极端的数据, 挂钩在15位置,g=20,质量都为25,则计算得力矩最大值15*25*20=7500;挂钩在-15时,同理得力矩最大值-7500;为了避免出现负数,j Read More
posted @ 2012-08-07 09:43 To be an ACMan Views(209) Comments(0) Diggs(0)
简单DP用dp[i][j]表示第i个苹果掉落,刚好走了j步能吃到苹果的最大值读入时把两颗树的标号1,2处理成0,1,以下说的树的编号都是处理后的0,1;用num[i][2]来记录第i个秒掉落在两颗数的苹果个数,掉落在树0,则num[i][0]=1,num[i][1]=0,掉落在树1,则num[i][1]=1,num[i][0]=0;(num[]数组记得初始化);dp[][]数组初始值: if(num[1][0]==1)dp[1][0]=1; dp[1][1]=1;状态转移:当j=0时,dp[i][j]的前一个状态只能是原地不动(且一定在树0位置)dp[i-1][j],所以dp[i][j]=dp Read More
posted @ 2012-08-06 19:11 To be an ACMan Views(226) Comments(0) Diggs(0)
类似背包DP。用dp[i][j](bool类型)来表示前i个数组成的和对k取模的值是否存在;状态转移方程为:if(dp[i-1][j])dp[i][get(tmp-j)]=dp[i][get(tmp+j)]=1;//get:自己写个取模函数,注意负数取模-5%7=2AC代码:View Code #include<stdio.h>#include<string.h>#include<algorithm>using namespace std;bool dp[10003][103];int k;int get(int x){ return x < 0 ? Read More
posted @ 2012-08-05 22:54 To be an ACMan Views(220) Comments(0) Diggs(0)
简单DP题意:由0-k这些数字组成的长度为n的数(并满足某个条件)的个数占所有总数的比例。(满足某个条件:各个位的数字与其相邻的数字之差不超过1.)用数组dp[i][j]表示满足以j结尾,长度为i的数的个数;则适当思考可以得状态转移方程为 : dp[i][j]=dp[i-1][j-1]+dp[i-1][j]+dp[j+1]; (0<j<k) dp[i][j]=dp[i-1][j]+dp[i-1][j+1]; (j==0) dp[i][j]=dp[i-1][j]+dp[i][j-1]; (j==k)这里要考虑是不是边界AC代码Vi... Read More
posted @ 2012-08-05 21:53 To be an ACMan Views(284) Comments(0) Diggs(0)