背包模板

我们以HDU 1171 Big Event in HDU 为例

代码来源:http://growthinking.com/archives/844

 1 #include<stdio.h>
2 #include<string.h>
3 int n,v[55],num[55],all,sum,dp[250005];
4 inline int max( int a,int b )
5 {
6 return a > b ? a : b;
7 }
8 void zo( int v,int w )
9 {
10 for( int j = sum; j >= v; --j )
11 dp[j] = max( dp[j-v] + w,dp[j] );
12 }
13 void co( int v,int w ) // 完全背包的
14 {
15 for( int j = v; j <= sum; ++j )
16 dp[j] = max( dp[j-v] + w,dp[j] );
17 }
18 void mu( int v,int w,int c )
19 {
20 if( v * c > sum ) // 判断是否是完全背包
21 co( v,w );
22 else
23 {
24 int k = 1;
25 while( c > k ) // 如果是多重背包,则用二进制优化
26 {
27 zo( k * v,k * w );
28 c -= k;
29 k <<= 1;
30 }
31 zo( c * v,c * w );
32 }
33 }
34 int main( )
35 {
36 while( scanf( "%d",&n ), n > 0 )
37 {
38 all = 0;
39 memset( dp,0,sizeof( dp ) );
40 for( int i = 0; i < n; ++i )
41 scanf( "%d%d",&v[i],&num[i] ),all += v[i]*num[i];
42 sum = all / 2;
43 for( int i = 0; i < n; ++i )
44 mu( v[i],v[i],num[i] );
45 if( dp[sum] > all - dp[sum] )
46 printf( "%d %d\n",dp[sum],all - dp[sum] );
47 else
48 printf( "%d %d\n",all - dp[sum],dp[sum] );
49 }
50 return 0;
51 }

  

  

posted @ 2011-07-25 20:06  贺佐安  阅读(393)  评论(0编辑  收藏  举报