01、完全、多重背包模板
阿新 • • 發佈:2017-11-09
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、完全、多重背包模板