HDU 1114 Piggy-Bank 完全背包入门
这题题意大致是一个蓄钱小猪,空质量w1,装了钱的质量w2,然后给出各种钱的价值及重量,问着个钱罐至少要存多少钱这题是完全背包入门的一经典啊,现在我还不是太理解完全背包。下面说说我的理解吧。完全背包是要把每种都尽量往里面放,每种都放到使总值最大,(为神马这样放就能把每种放到最大呢?客观请继续看)最后看所有种类全部放进去,并且放到使总值最大,好吧。至于为神马从后面往前面放就是0-1背包呢,即只能放一个,并且是依靠前面的呢,因为如果从w[i]-W,在0-1背包中,当W-w[i]>w[i]时,就有可能在dp[W]放w[i]时就已经把w[i]放进去了,即完全背包,这样就重复放了w[i],这显然与0-1背包不符,而这种正是完全背包所需要的,所以,0-1背包跟完全背包的计算只是计算顺序不同。over
#include<stdio.h>
#include<string.h>
int w1,w2,v[505],w[505],n,dp[10005],W;
int inf = 1000000000;
int min( int a,int b )
{
return a < b ? a : b;
}
void DP( )
{
for( int i = 1; i <= W; ++i )
dp[i] = inf;
dp[0] = 0;//这里别忘了。
for( int i = 1; i <= n; ++i )
for( int j = w[i]; j <= W; ++j )
dp[j] = min( dp[j-w[i]]+v[i],dp[j] );
}
int main( )
{
int t;
scanf( "%d",&t );
while( t-- )
{
scanf( "%d%d",&w1,&w2 );
W = w2 - w1;
scanf( "%d",&n );
for( int i = 1 ; i <= n; ++i )
scanf( "%d%d",&v[i],&w[i] );
DP( );
if( dp[W] < inf )
printf( "The minimum amount of money in the piggy-bank is %d.\n",dp[W] );
else
puts( "This is impossible." );
}
return 0;
}
本人还是新手 ,转载请注明来自Lvsi‘s home
浙公网安备 33010602011771号