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
浙公网安备 33010602011771号