OJ题目 : click here ~~
题意分析:就是一个简单的完全背包问题。完全背包与01背包只有重量的循环次序不同。01背包是从大到小,完全背包相反。有的题目要求“恰好装满背包” 时的最优解, 有的则并没有要求必须把背包装满。一种区别这两种问法的实现方法是在初始化时有所不同。要求恰好装满背包,那么在初始化时dp[ 0 ] 为 0 ,其他设为-inf (求最大),inf(求最小)。如果并没有要求装满,而是只希望价格尽量大,初始化时应该将dp[ i ]全部设为 0 。
AC_CODE
int E , F , N , P[502] , W[502];
const int inf = 100000000;
int dp[10002];
int main()
{
int t;
cin >> t;
while(t--)
{
scanf("%d%d%d",&E ,&F, &N);
F -= E;
int i , j;
for(i = 1;i <= N;i++)
{
scanf("%d%d",&P[i],&W[i]);
}
for(i = 1;i <= F;i++)
dp[i] = inf;//如果是求最大价值,赋值为-inf
dp[0] = 0;//恰好装满
for(i = 1;i <= N;i++)
for(j = W[i];j <= F;j++)//因为是完全背包,所以重量从小到大,与01背包相反
dp[j] = min(dp[j] , dp[j - W[i]] + P[i]);//求最小价值
if(dp[F] == inf) printf("This is impossible.\n");
else printf("The minimum amount of money in the piggy-bank is %d.\n",dp[F]);
}
return 0;
}