背包--基础--01,完全,组合
01背包
有 N 件物品和一个容量为 V的背包。放入第 i件物品花费的费用是 c [ i ],得到的价值是 w [ i ] ,求将哪些物品装入背包可使价值总和最大。
for (int i = 1; i <= n; i++)
for (int j = V; j >= c[i]; j--)
f[j] = max(f[j], f[j - c[i]] + w[i]);
完全背包
有 N 种物品和一个容量为 V的背包,每种物品都有无限件可用。第 i 种物品的费用是 c [ i ] ,价值是 w [ i ]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。
for(int i=1;i<=N;++i){
for(int j=c[i];j<=V;++j){
f[j] = max(f[j],f[j-c[i]]+w[i]);
}
}
组合背包
有 N 种物品和一个容量为 V 的背包。第 i 种物品最多有 p [ i ] 件可用,每件费用是 c [ i ] ,价值是 w [ i ] 。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。
for(int i=1;i<=N;++i){
for(int j = V;j>=c[i];++j){
for(int k=1;k<=p[i];++k){
f[j] = max(f[j],f[j-c[i]*k]+w[i]*k);
}
}
}
向wjmzbmr学习,acm本就是逆天而行。
浙公网安备 33010602011771号