【问题描述】还是背包问题,不过有的物品只能取一次(0/1背包),有的可以取无限次(完全背包),有的只能取有限次(多重背包)。怎么解决? 由于我们按物品划分阶段,所以没有必要想太多。下面给出伪代码: for (int i=1; i<N; i++) // 不变 if (物品i属于0/1背包) { // 按照0/1背包的做法取物品i for (int c=C;c>=0;c--) if (c>=w) f[c] = max(f[c], f[c-w] + v); } else if (物品i属于完全背包) { // 按照完全背包的做法取物品i for (int c=0;c<=C;c++) if (c>=w) f[c] = max(f[c], f[c-w] + v); } else if (物品i属于多重背包) { // 按照多重背包的做法取物品i …… } |
|