背包问题模板
约定物品个数为n,总空间为m,每种物品所占体积为v[i],价值为w[i],个数为num[i],一组内物品为kind[i]
01背包:
for(int i = 1; i <= n; i++){
for(int j = m; j >= 0; j--){
if(j >= v[i]){
dp[j] = max(dp[j],dp[j -v[i]] + w[i]);
}
}
}
完全背包:
for(int i = 1; i <= n; i++){
for(int j = v[i]; j <= m; j++){
dp[j] = max(dp[j],dp[j -v[i]] + w[i]);
}
}
多重背包:
for(int i = 1; i <= n; i++){
for(int j = 1; j <= num[i]; j++){
for(int k = v[i]; k <= m; k++){
dp[j] = max(dp[j],dp[j - v[i]] + w[i]);
}
}
}
分组背包;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= num[i]; j++){
for(int k = m; k >= v[kind[j]]; k++){
dp[j] = max(dp[j],dp[j - v[i]] + w[i]);
}
}
}

浙公网安备 33010602011771号