动态规划-多重背包问题-二进制转换

其中的cu为单个物品的开销cost,vu为单个物品的价值value,nu为物品个数。

void divide(int cu,int vu,int nu)
{
    int i=1;
    while(nu-i>=0)
    {
        cost[++n]=cu*i;
        value[n]=vu*i;

        nu-=i;
        i<<=1;
    }

    if(nu)
    {
        cost[++n]=cu*nu;
        value[n]=vu*nu;
    }
}

按这种方式生成的物品能够等效于一个一个地放物品,并且时间复杂度从O(N)降为O(logN)。

你可能感兴趣的:(NOIP)