HDU 2602 Bone Collector 背包
这是一道经典的背包问题很水有两种方法,如果用二维做的话就要注意,体积要重0开始,因为测试数据很淫荡
#include<stdio.h> #include<string.h> int n,V,t,val[1024],v[1024],dp[1024][1024]; void DP( ) { memset( dp,0,sizeof( dp ) ); for( int i = 1; i <= n; ++i ) for( int j = 0; j <= V; ++j ) if( j >= v[i] && dp[i-1][j-v[i]] + val[i] > dp[i-1][j] ) dp[i][j] = dp[i-1][j-v[i]] + val[i]; else//这一步不能省啊 dp[i][j] = dp[i-1][j]; } int main( ) { scanf( "%d",&t ); while( t-- ) { scanf( "%d%d",&n,&V ); for( int i = 1; i <= n; ++i ) scanf( "%d",&val[i] ); for( int i = 1; i <= n; ++i ) scanf( "%d",&v[i] ); DP(); printf( "%d\n",dp[n][V] ); } return 0; }
另外一种是一维
#include<stdio.h> #include<string.h> int t,w[1024],v[1024],dp[1024],n,val; int main( ) { scanf( "%d",&t ); while( t-- ) { scanf( "%d%d",&n,&val ); for( int i = 0; i < n; ++i ) scanf( "%d",&v[i] ); for( int i = 0; i < n; ++i ) scanf( "%d",&w[i] ); memset( dp,0,sizeof( dp ) ); for( int i = 0; i < n; ++i ) for( int j = val; j >= w[i]; --j ) dp[j] = dp[j-w[i]]+v[i] > dp[j] ? dp[j-w[i]]+v[i]:dp[j]; printf( "%d\n",dp[val] ); } return 0; }
本人还是新手 ,转载请注明来自Lvsi‘s home