首页 > 代码库 > POJ 1014 Dividing(多重背包+二进制优化)
POJ 1014 Dividing(多重背包+二进制优化)
http://poj.org/problem?id=1014
题意:
6个物品,每个物品都有其价值和数量,判断是否能价值平分。
思路:
多重背包。利用二进制来转化成0-1背包求解。
1 #include<iostream> 2 #include<string> 3 #include<cstring> 4 #include<cstdio> 5 #include<algorithm> 6 using namespace std; 7 8 const int maxn = 70000; 9 int sum;10 int a[7];11 int d[maxn];12 int w[maxn];13 14 int main()15 {16 //freopen("D:\\txt.txt", "r", stdin);17 int kase = 0;18 while (scanf("%d", &a[1]))19 {20 for (int i = 2; i <= 6; i++)21 scanf("%d", &a[i]);22 sum = 0;23 for (int i = 1; i <= 6; i++)24 sum += i*a[i];25 if (sum == 0) break;26 27 printf("Collection #%d:\n", ++kase);28 29 if (sum % 2)30 {31 printf("Can‘t be divided.\n\n");32 continue;33 }34 int count = 0;35 for (int i = 1; i <= 6; i++)36 {37 int m = a[i];38 int k = 1;39 while (k < m)40 {41 w[count++] = k*i;42 m -= k;43 k *= 2;44 }45 w[count++] = m*i;46 }47 sum = sum / 2;48 memset(d, 0, sizeof(d));49 for (int i = 0; i < count; i++)50 {51 for (int j = sum; j >= w[i]; j--)52 d[j] = max(d[j], d[j - w[i]] + w[i]);53 }54 if (d[sum]==sum)55 printf("Can be divided.\n\n");56 else57 printf("Can‘t be divided.\n\n");58 }59 }
POJ 1014 Dividing(多重背包+二进制优化)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。