LeeBlog

导航

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

posted on 2011-05-18 01:39  LeeBlog  阅读(267)  评论(0编辑  收藏  举报