这是一道完全背包问题,不过这个需要恰好装满……以下为背包问题三种情况……
1:如果求最大价值且恰好装满,那么在初始化时将dp[0]为0, 其余为负无穷大
2:如果求最小价值且恰好装满,那么在初始化时将dp[0]为0, 其余为正无穷大
3:如果没有要求恰好装满,则dp[0……n]全初始化为0
//提示:在平时求最大值时,一般初始化max为负无穷大,求最小值时,一般初始化min为正无穷大*/
#include<stdio.h>
int main()
{
int T, E, F, N;
int dp[10001];
int v[501], w[501];
int weight, i, j;
scanf("%d", &T);
while( T-- )
{
scanf("%d %d", &E, &F);
scanf("%d", &N);
for(i=1; i<=N; i++)
scanf("%d %d",v+i, w+i);
dp[0]=0;
weight=F-E;//硬币的总重量
for(i=1; i<=weight; i++)
dp[i]=999999;//将dp[1……n]设为正无穷大
for(i=1; i<=N; i++)
for(j=w[i]; j<=weight; j++)//无穷背包需要顺序,而0 1背包需要倒序
{
if( dp[j-w[i]]+v[i]<dp[j])
dp[j]=dp[j-w[i]]+v[i];
}
if(dp[weight]<999999)//若dp[n]被更新了,说明装满了
printf("The minimum amount of money in the piggy-bank is %d.\n",dp[weight]);
else
printf("This is impossible.\n");
}
}