LeeBlog

导航

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

posted on 2011-05-14 00:02  LeeBlog  阅读(594)  评论(0编辑  收藏  举报