解题思路:多重背包
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 = 100010 ;
int n, m, C;
int d[110];
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
clr(d, 0);
scanf("%d%d", &m, &n);
for (int i=1; i<=n; ++i)
{
int p, w, c;
scanf("%d%d%d", &p, &w, &c);
multiPack(p, w, c);
}
//output
printf("%d\n", d[m]);
}
return 0;
}