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