HDU_1059 Dividing 【多重背包】
2018-03-04 09:57
309 查看
题目链接
题目描述
给定六件物品,问是否可以按照价值平分解题思路
经典的多重背包问题代码部分
#include <iostream> #include <string.h> #include <stdio.h> using namespace std; const int maxn = 10; int f[200000]; int weight[maxn], value[maxn], num[maxn]; int V, N; /* 01背包,v为降序 f[v]:表示把前i件物品放入容量为v的背包中获得的最大收益。 f[v] = max(f[v],f[v - Weight[i]] + Value[i]); */ void ZeroOnePack(int nWeight,int nValue) { for (int v = V; v >= nWeight; v--) { f[v] = max(f[v],f[v - nWeight] + nValue); } } /* 完全背包,v为增序。 f[v]:表示把前i件物品放入容量为v的背包中获得的最大收益。 f[v] = max(f[v],f[v - Weight[i]] + Value[i]); */ void CompletePack(int nWeight,int nValue) { for (int v = nWeight; v <= V; v++) { f[v] = max(f[v],f[v - nWeight] + nValue); } } int MultiplePack() { int k = 1; int nCount = 0; for (int i = 1; i <= N; i++) { if (weight[i] * num[i] >= V) { //此时满足条件Weight[i] * Num[i] >= V时, //完全背包:该类物品相当于是无限供应,直到背包放不下为止。 CompletePack(weight[i],value[i]); } else { k = 1; nCount = num[i]; while(k <= nCount) { ZeroOnePack(k * weight[i],k * value[i]); nCount -= k; k *= 2; } ZeroOnePack(nCount * weight[i],nCount * value[i]); } } return f[V]; } int main() { int cas = 1; while(~scanf("%d%d%d%d%d%d",&num[1],&num[2],&num[3],&num[4],&num[5],&num[6])) { memset(f, 0, sizeof(f)); if(num[1] == 0 && num[2] == 0&& num[3] == 0&& num[4] == 0&& num[5] == 0&& num[6] == 0) { break; } N = 6; int sum = 0; for(int i = 1; i <= 6; ++ i) { weight[i] = value[i] = i; sum += num[i] * i; } printf("Collection #%d:\n", cas ++); if(sum % 2 != 0) { printf("Can't be divided.\n\n"); continue; } bool f = false; V = sum / 2; if(V == MultiplePack()) { f = true; } if(f) printf("Can be divided.\n\n"); else printf("Can't be divided.\n\n"); } return 0; }
相关文章推荐
- HDU-1059 Dividing (多重背包)
- hdu 1059 Dividing 多重背包
- HDU 1059 Dividing 多重背包
- HDU 1059 Dividing (多重背包二进制优化)
- hdu1059 Dividing 多重背包
- HDU1059——Dividing多重背包
- HDU 1059 Dividing 多重背包
- DP(完全背包二进制优化) Problem T:Dividing(HDU 1059)
- HDU 1059 Dividing 多重背包
- hdu 1059 Dividing DP,多重背包 测试数据很水
- HDU 1059 Dividing(dp多重背包)
- 【HDU - 1059 Dividing】 混合背包
- hdu 1059 Dividing (多重背包)
- (step3.3) hdu 1059(Dividing——多重背包)
- HDU1059 Dividing(背包问题)
- HDU 1059 Dividing (多重背包问题)
- HDU 1059 Dividing(多重背包)
- HDU 1059 Dividing 【DP背包】
- hdu 1059 Dividing(多重背包)
- hdu 1059 Dividing(完全背包)