1 int dp[N];
2 void OneZeroPack( int v , int c , int w ){//01背包
3 for( int i = v ; i >= c ; i-- )
4 dp[i] = max( dp[i] , dp[i-c] +w ) ;
5 }
6 void CompletePack( int v , int c , int w ){//完全背包
7 for( int i = c ; i <= v ; i++ )
8 dp[i] = max( dp[i] , dp[i-c] +w ) ;
9 }
10 void MultipliePack( int v , int c, int w , int n){//多重背包
11 if( n*c >= v ){
12 CompletePack( v , c , w ) ;
13 return ;
14 }
15 int k = 1 ;
16 while( k < n ){
17 OneZeroPack( v , k*c , k*w ) ;
18 n -= k ;
19 k <<= 1 ;
20 }
21 OneZeroPack( v , n*c , n*w ) ;
22 }