View Code
void ZeroOnePack(int c,int w)
{
    for(int i=V;i>=c;i--)
        dp[i]=max(dp[i],dp[i-c]+w) ;
    return ;
}
void CompletePack(int c,int w)
{
    for(int i=c;i<=V;i++)
        dp[i]=max(dp[i],dp[i-c]+w) ;
    return ;
}
void MultiplePack(int c,int w,int a)
{
    if(c*a>=V)
    {
        CompletePack(c,w) ;
        return ;
    }
    int k=1 ;
    while(k<a)
    {
        ZeroOnePack(k*c,k*w) ;
        a-=k ;
        k<<=1 ;
    }
    ZeroOnePack(a*c,a*w) ;
}