您的位置:首页 > 其它

HDU 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 多重背包

2011-05-18 01:39 633 查看
下面是以简短代码,但是我觉得还是标准版的好

#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
);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐