POJ 1014 Dividing 多重背包
2013-08-29 10:36
197 查看
让物体的重量等于价值,用总价值的一半的包去装这些物品,看其是否能装满
![](http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
View Code
![](http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
View Code
#include<stdio.h> #include<string.h> int dp[120005], a[8]; int max(int a, int b) { return a > b ? a : b;} int main() { int i, j, cas = 1, n, m; while( ~scanf("%d", &a[1]) ) { int sum = a[1]; for(i = 2; i <= 6; i++) { scanf("%d", &a[i]); sum += i * a[i]; } if(!sum) break; printf("Collection #%d:\n", cas++); if(sum & 1) { printf("Can't be divided.\n\n");continue; } sum >>= 1; memset(dp, 0, sizeof(dp)); for(i = 1; i <= 6; i++) { if(i * a[i] >= sum) for(j = i; j <= sum; j++) dp[j] = max(dp[j], dp[j-i]+i); else { int k = 1; while(k < a[i]) { for(j = sum; j >= i*k; j--) dp[j] = max(dp[j], dp[j-i*k]+i*k); a[i] -= k; k <<= 1; } for(j = sum; j >= i*a[i]; j--) dp[j] = max(dp[j], dp[j-i*a[i]]+i*a[i]); } if(dp[sum] == sum) break; } if(dp[sum] == sum) printf("Can be divided.\n\n"); else printf("Can't be divided.\n\n"); } return 0; }
相关文章推荐
- poj1014 dividing(多重背包+二进制优化)
- Dividing----POJ_1014----多重背包问题
- 【动态规划/多重背包问题】POJ1014-Dividing
- 20140715 「DP - 多重背包」 POJ 1014 Dividing
- poj 1014 Dividing <多重背包>
- Hdu 1059 Dividing & Zoj 1149 & poj 1014 Dividing(多重背包)
- POJ 1014 Dividing 【DP 之 多重背包 / 二进制优化】
- poj1014 Dividing 多重背包DP+神剪枝
- poj 1014 Dividing(组合数学方法优化/多重背包问题+二进制优化)
- POJ 1014 Dividing (多重可行性背包)
- POJ 1014 Dividing (多重背包问题)
- 部分背包 poj1014 Dividing
- POJ 1014 Dividing (多重可行性背包)
- Poj 1014 Dividing(多重背包)
- POJ 1014 Dividing 多重背包
- poj 1014 & zoj 1149 Dividing(多重背包+倍增思想优化)
- POJ 1014 Dividing 多重背包
- POJ 1014 Dividing (多重背包问题+递归)【模板】
- poj 1014 Dividing 【多重背包】
- Poj 1014 Dividing(多重背包)