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 ); for( int i = 0; i < m; ++i ) scanf( "%d%d%d",&v[i],&w[i],&num[i] ); for( int i = 0; i < m; ++i ) for( int j = 0; j < num[i]; ++j ) for( int k = n; k >= v[i]; k-- ) { dp[k] = max ( dp[k - v[i]] + w[i],dp[k] ); if( dp[k] > ma ) ma = dp[k]; } printf( "%d\n",ma ); } return 0; }
标准版
#include<stdio.h> #include<string.h> int n,m,v[105],w[105],num[105],dp[105]; int max( int a,int b ) { return a > b ? a : b; } void zo1( int v,int w ) { for( int i = n; i >= v; --i ) dp[i] = max( dp[i-v] + w,dp[i] ); } void com( int v,int w ) { for( int i = v; i <= n; ++i ) dp[i] = max( dp[i-v] + w, dp[i] ); } void mul( int v,int w,int c ) { if( v * c > n ) com( v,w ); else { int k = 1; while( k < c ) { zo1( k * v,k * w ); c -= k; k <<= 1; } zo1( c * v,c * w ); } } int main( ) { int t; scanf( "%d",&t ); while( t-- ) { memset( dp,0,sizeof( dp ) ); scanf( "%d%d",&n,&m ); for( int i = 0; i < m; ++i ) scanf( "%d%d%d",&v[i],&w[i],&num[i] ); for( int i = 0; i < m; ++i ) mul( v[i],w[i],num[i] ); printf( "%d\n",dp[n] ); } return 0; }
本人还是新手 ,转载请注明来自Lvsi‘s home