解题思路:完全背包
注意要初始 d[0] = 0
AC代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
#define clr(p,v) memset(p,v,sizeof(p))
const int maxn = 10010 ;
int n, m, C;
int d[maxn];
void zeroOnePack(int cost, int weight)
{
for (int i=m; i>=cost; --i)
d[i] = max(d[i], d[i-cost]+weight);
}
void completePack(int cost, int weight)
{
for (int i=cost; i<=m; ++i)
d[i] = max(d[i], d[i-cost]+weight);
}
void multiPack(int cost, int weight, int amount)
{
if (cost*amount >= m)
completePack(cost, weight);
else
{
int num = 1;
while (num <= amount)
{
zeroOnePack(num*cost, num*weight);
amount -= num;
num <<= 1;
}
zeroOnePack(amount*cost, amount*weight);
}
}
int main()
{
scanf("%d", &C);
while (C--)
{
//Input && Calculate
int tt;
scanf("%d%d%d", &tt, &m, &n);
m -= tt;
//init d[]
for (int i=1; i<=m; ++i)
d[i] = -500000010;
d[0] = 0;
for (int i=1; i<=n; ++i)
{
int p, w;
scanf("%d%d", &p, &w);
completePack(w, -p);
}
//output
if (-d[m] != 500000010 && d[m])
printf("The minimum amount of money in the piggy-bank is %d.\n", -d[m]);
else
puts("This is impossible.");
}
return 0;
}