算法入门笔记:背包dp
//01背包
void ZeroOnePack(int v, int w, int m) { //v为当前物品的容量 m为给定最大的容量 w为当前物品的价值
for (int i = m; i >= v; i--) {
dp[i] = max(dp[i], dp[i - v] + w);
}
}
//完全背包
void CompletePack(int v, int w, int m) { //v为当前物品的容量 m为给定最大的容量 w为当前物品的价值
for (int i = v; i <= m; i++) {
dp[i] = max(dp[i], dp[i - v] + w);
}
}
//多重背包
void MultiPack(int v, int w, int m, int c) { //v为当前物品的容量 m为给定的最大容量 w为当前物品的价值 c为剩余物品的数量
if (v * c >= m) {
CompletePack(v, w, m);
}
else {
int k = 1;
while (k < c) {
ZeroOnePack(k * v, k * w, m);
c -= k;
k <<=1;
}
ZeroOnePack(c * v, c * w, m);
}
}