ACM模板
void CompletePack(int cost,int weight,int V)
{
int i;
for( i = cost; i <= V;i ++)
dp[i] = max(dp[i],dp[i-cost]+weight);
return ;
}
void ZeroOnePack(int cost,int weight,int V)
{
int i;
for( i = V; i >= cost; i --)
dp[i] = max(dp[i],dp[i-cost]+weight);
return ;
}
MultiplePack(int v[],int w[],int num[],int n,int V)
{
memset(dp,0,sizeof(dp));
for(i = 1; i <= n; i ++)
{
if(v[i]*num[i] > V)
{
CompletePack(v[i],w[i],V);
}
else
{
int k = 1;
while( k < num[i])
{
ZeroOnePack(k*v[i],k*w[i],V);
num[i] -= k;
k*= 2;
}
ZeroOnePack(num[i]*v[i],num[i]*w[i],V);
}
}
return dp[V];
}