LeeBlog

导航

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;
}

posted on 2011-04-27 11:16  LeeBlog  阅读(287)  评论(0编辑  收藏  举报