Hdu 1059 Dividing & Zoj 1149 & poj 1014 Dividing(多重背包)
2013-08-24 19:31
323 查看
多重背包模板~
#include <stdio.h> #include <string.h> int a[7]; int f[100005]; int v, k; void ZeroOnePack(int cost, int weight) { for (int i = v; i >= cost; i--) if (f[i - cost] + weight > f[i]) f[i] = f[i - cost] + weight; } void CompletePack(int cost, int weight) { for (int i = cost; i <= v; i++) if (f[i - cost] + weight > f[i]) f[i] = f[i - cost] + weight; } void MultiplePack(int cost, int weight, int amount) { if (cost * amount >= v) CompletePack(cost, weight); else { for (int k = 1; k < amount;) { ZeroOnePack(k * cost, k * weight); amount -= k; k <<= 1; } ZeroOnePack(amount * cost, amount * weight); } } int main() { int sum; int cas = 0; while (1) { sum = 0; for (int i = 1; i < 7; i++) { scanf("%d", &a[i]); sum += a[i] * i; } if (sum == 0) break; if (sum % 2 == 1) { printf("Collection #%d:\nCan't be divided.\n\n", ++cas); continue; } else { v = sum / 2; memset(f, 0, sizeof(f)); for (int i = 1; i < 7; i++) MultiplePack(i, i, a[i]); if (f[v] == v) printf("Collection #%d:\nCan be divided.\n\n", ++cas); else printf("Collection #%d:\nCan't be divided.\n\n", ++cas); } } return 0; }
相关文章推荐
- Hdu 1059 Dividing & Zoj 1149 & poj 1014 Dividing(多重背包)
- zoj 1149 && hdu 1059 && poj 1014 Dividing
- ZOJ1149 POJ1014 HDU1059 Dividing,多重背包问题
- HDU1059 && POJ1014 :Dividing(多重背包)
- hdu1059 &poj1014 Dividing (多重背包)
- POJ 1014 && HDU 1059 Dividing(完全背包问题)
- ZOJ 1149 || POJ 1014 || HDU 1059 Dividing
- poj 1014 & zoj 1149 Dividing(多重背包+倍增思想优化)
- HDU1059 && POJ1014 :Dividing(多重背包)
- zoj 1149 || poj 1014 Dividing(多重背包)
- poj 1014||hdu 1059 dividing(多重背包 二进制优化)
- POJ 1014 / HDU 1059 Dividing (多重背包&剪枝&单调队列)
- poj 1014 && zoj 1149 Dividing --- dfs剪枝
- HDU 1059 POJ 1014 Dividing (多重背包)
- [dp问题] Poj 1014 & Zoj 1149 (Dividing) 解题报告(转)
- poj1014 hdu1059 Dividing 多重背包
- poj1014 hdu1059 Dividing 多重背包
- hdu 1059&&POJ 1014 Dividing
- poj 1014 || zoj 1149 Dividing
- HDOJ 1059 POJ 1014 Dividing 【多重背包】