解题思路:完全背包
注意要初始 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;
}

本文介绍了一个使用完全背包算法解决的问题实例。通过初始化数组并利用完全背包的特性进行迭代更新,最终求解出背包能容纳的最大价值。代码中详细展示了如何处理物品的加入,并通过具体的例子演示了整个求解过程。
252

被折叠的 条评论
为什么被折叠?



