题目链接: 点击打开链接
题目大意: 买米,给定总钱数,每种米的价格,重量,数量,问能买到的最大重量是多少
思路: 动态规划,多重背包
分析:
多重背包入门题,直接套模板
代码:
#include <cstdio>
#include <memory.h>
#include <algorithm>
using namespace std;
const int maxm = 100 + 10;
const int maxn = 100 + 10;
int V, m, cost[maxm], weight[maxm], amount[maxm], dp[maxn];
void ZeroOnePack(int cost, int value)
{
for (int i = V; i >= cost; --i)
dp[i] = max(dp[i], dp[i - cost] + value);
}
void ComPack(int cost, int value)
{
for (int i = cost; i <= V; ++i)
dp[i] = max(dp[i], dp[i - cost] + value);
}
void MulPack(int cost, int value, int amount)
{
if (cost * amount > V) {
ComPack(cost, value);
return;
}
for (int i = 1; i <= amount; i <<= 1) {
ZeroOnePack(cost * i, value * i);
amount -= i;
}
ZeroOnePack(cost * amount, value * amount);
}
void solve()
{
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= m; ++i)
MulPack(cost[i], weight[i], amount[i]);
}
int main()
{
int C;
scanf("%d", &C);
while (C--)
{
scanf("%d %d", &V, &m);
for (int i = 1; i <= m; ++i)
scanf("%d %d %d", &cost[i], &weight[i], &amount[i]);
solve();
printf("%d\n", dp[V]);
}
return 0;
}