1. 程式人生 > >01、完全、多重背包模板

01、完全、多重背包模板

int soft ont family color 限制 else 完全背包 log

背包問題:

背包總容量為W,有n件重量為weight[i],權值為value[i]的物品

1、01背包:

這是最基礎的背包問題,特點是:每種物品僅有一件,可以選擇放或不放。

1 void ZeroOnePack (int weight,int value)
2 {
3     for (int w = W; w >= weight; w--)
4         dp[w] = max(dp[w - weight] + value, dp[w]);
5 }

2、完全背包:

每件物品有無限多個。

void CompletePack (int weight,int value)
{
	for (int w = weight; w <= W; w++)
		dp[w] = max(dp[w - weight] +value, dp[w]);
}

3、多重背包:

每件物品有有限制多個。(二進制優化)

void MultiplePack (int weight,int value,int count)
{
    if (weight * count > W)
    {
        CompletePack (weight,value);
    }
    else
    {
        int k = 1;  
        while(k<count)  
        {  
            ZeroOnePack (k * weight,k * value);  
            count 
-= k; k = k << 1; } ZeroOnePack (count * weight,count * value); } }

01、完全、多重背包模板