学长给的代码:
可作参考
void pack01(int a, int b) //0 - 1 背包
{
int i;
for(i = Sum; i >= a; i ++)
dp[i] = maxz(dp[i-a] + b, dp[i]);
}
void packcmp(int a, int b) //完全背包
{
int i ;
for(i = a; i <= Sum; i ++)
dp[i] = maxz(dp[i-a] + b, dp[i]);
}
void packmul() //多重背包
{
int i, k;
for(i = 1; i <= n; i ++)
{
if(num[i] * w[i] >= Sum)
{
packcmp(w[i], g[i]);
}
else
{
int k = 1;
int amount = num[i];
while( k < amount)
{
pack01(k * w[i], k * g[i]);
amount -= k;
k *= 2;
}
pack01(amount * w[i], amount * g[i]);
}
}
}