int c[M], w[M], n1[M];//c:费用 w:价值 n1:数量 int f[M];//f[与V有关],c和w[与n]有关 int v, V, V1;//V:容量 V1:容量2 //01背包 void ZeroOnePack(int c, int w) { for (int v = V; v >= c; v--) { f[v] = Max(f[v], f[v-c] + w); } } //完全背包 void CompletePack(int c, int w) { for (int v = c; v <= V; v++) { f[v] = Max(f[v], f[v-c] + w); } } //多重背包,二进制。 void MultiplePack(int c, int w, int n1) { if (c * n1 >= V) { CompletePack(c, w); } else { int k = 1; while (k < n1) { ZeroOnePack(k*c, k*w); n1 -= k; k <<= 1; } ZeroOnePack(n1*c, n1*w); } }
多重背包模板
最新推荐文章于 2025-03-30 21:22:01 发布