LeeBlog

导航

2011年5月18日 #

母函数用多重背包来解

摘要: 其实母函数基本都可以用多重背包来解,我在做母函数时,我的代码500多MS有的甚至过不了,而cadl神的是0MS,就倍感惊讶啊,我的超时,为神马别人的那么少啊,一问原来是用背包做的,这里来讲一讲母函数用背包做的一点小理解吧,以HDU 1284为例,dp[j]代表着钱为j时的选法,当循环到第i次时,(即前面的coin[1,2....i-1]已经选完了 )对于j有两种选法,一:不选coin[i],那么它的选法就是原来不选coin[i]的选法dp[j],选coin[i]的选法有多少种呢???? 不就是dp[j-coin[i]] ( 为神马是这样呢?因为你如果在j那里选了coin[i],那么他选coin 阅读全文

posted @ 2011-05-18 17:07 LeeBlog 阅读(299) 评论(0) 推荐(0) 编辑

多重背包O(N*V)算法详解(使用单调队列)(转载)

摘要: 多重背包问题:有N种物品和容量为V的背包,若第i种物品,容量为v[i],价值为w[i],共有n[i]件。怎样装才能使背包内的物品总价值最大?网上关于“多重背包”的资料倒是不少,但是关于怎么实现O(N*V)算法的资料,真得好少呀,关于“单调队列”那部分算法,又没说明得很清楚,看了几遍没看懂原理,只好自己动脑去想怎么实现O(N*V)算法。若用F[i][j]表示对容量为j的背包,处理完前i种物品后,背包内物品可达到的最大总价值,并记m[i] = min(n[i], j / v[i])。放入背包的第i种物品的数目可以是:0、1、2……,可得:F[i][j] = max { F[i - 1] [j – 阅读全文

posted @ 2011-05-18 14:26 LeeBlog 阅读(384) 评论(0) 推荐(0) 编辑

HDU 2844 Coins 多重背包

摘要: 这题看着我第一感觉是母函数,但是据说母函数会TLE,就果断多重背包了,而这里用多重背包做,明显不能直接把dp[n]输出来,那样结果是错的,那怎么才能找到种类呢。if( dp[i] ) ++c;??????这样行吗???? 不行,这是后要想到dp[i]的含义,dp[i]代表着在重量i时能找到的最大价值,而这里的重量和价值都是钱,所以就有很方便的一个地方了,dp[i]中最多能装下i的话那么肯定i能够选到,所以就有判断条件了if( dp[i] == i ) ++c;直接上代码吧#include<stdio.h>#include<string.h>//#define max( 阅读全文

posted @ 2011-05-18 10:51 LeeBlog 阅读(187) 评论(0) 推荐(0) 编辑

HDU 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 多重背包

摘要: 下面是以简短代码,但是我觉得还是标准版的好#include<stdio.h>#include<string.h>int n,m,v[105],w[105],num[105],dp[105],ma;int max( int a,int b ){ return a > b ? a : b;}int main( ){ int t; scanf( "%d",&t ); while( t-- ) { ma = 0; memset( dp,0,sizeof( dp ) ); scanf( "%d%d",&n,&m 阅读全文

posted @ 2011-05-18 01:39 LeeBlog 阅读(267) 评论(0) 推荐(0) 编辑