【HDU
来源:互联网 发布:php 数组头部添加元素 编辑:程序博客网 时间:2024/06/05 08:54
I - Dividing
Marsha and Bill own a collection of marbles. They want to split the collection among themselves so that both receive an equal share of the marbles. This would be easy if all the marbles had the same value, because then they could just split the collection in half. But unfortunately, some of the marbles are larger, or more beautiful than others. So, Marsha and Bill start by assigning a value, a natural number between one and six, to each marble. Now they want to divide the marbles so that each of them gets the same total value.
Unfortunately, they realize that it might be impossible to divide the marbles in this way (even if the total value of all marbles is even). For example, if there are one marble of value 1, one of value 3 and two of value 4, then they cannot be split into sets of equal value. So, they ask you to write a program that checks whether there is a fair partition of the marbles.
Unfortunately, they realize that it might be impossible to divide the marbles in this way (even if the total value of all marbles is even). For example, if there are one marble of value 1, one of value 3 and two of value 4, then they cannot be split into sets of equal value. So, they ask you to write a program that checks whether there is a fair partition of the marbles.
The last line of the input file will be ``0 0 0 0 0 0''; do not process this line.
Output a blank line after each test case.
1 0 1 2 0 01 0 0 0 1 10 0 0 0 0 0
Collection #1:Can't be divided.Collection #2:Can be divided.
题意:有价值分别为1~6的大理石,现要将这些大理石分为价值相等的两部分,输出是否可实现分离。
分析:一个裸的混合背包问题。在做背包之前先判断大理石的总价值sum是否为奇数,若为奇数直接判断无法分离。若是偶数则将总价值sum /= 2,以sum值作为背包容量。最后判断dp[sum]是否等于sum,若等于则可分离,否则无法分离。
代码如下:
#include <set>#include <map>#include <queue>#include <cmath>#include <vector>#include <cctype>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define mod 835672545#define INF 0x3f3f3f3f#define LL long longusing namespace std;const int MX = 120005;int n, m;int sum;int a[10];int dp[MX];void zeroOnePack(int v){ for(int i = sum; i >= v; i--){ dp[i] = max(dp[i], dp[i-v] + v); }}void completePack(int v){ for(int i = v; i <= sum; i++){ dp[i] = max(dp[i], dp[i-v] + v); }}void mutiPack(int v, int w){ if(v * w >= sum){ completePack(v); return ; } int k = 1; while(k < w){ zeroOnePack(k*v); w -= k; k <<= 1; } zeroOnePack(w*v);}int main(){ int cas = 0; while(~scanf("%d", &a[1])){ memset(dp, 0, sizeof(dp)); sum = a[1]; for(int i = 2; i <= 6; i++){ scanf("%d", &a[i]); sum += a[i]*i; } if(a[1] + a[2] + a[3] + a[4] + a[5] + a[6] == 0) return 0; printf("Collection #%d:\n", ++cas); if(sum & 1){ printf("Can't be divided.\n\n"); continue; } sum /= 2; for(int i = 1; i <= 6; i++){ mutiPack(i, a[i]); } if(dp[sum] == sum) printf("Can be divided.\n\n"); else printf("Can't be divided.\n\n"); } return 0;}
阅读全文
0 0
- hdu
- hdu
- HDU
- hdu ()
- hdu
- hdu
- HDU
- HDU
- hdu
- hdu
- HDU
- Hdu
- hdu
- hdu-
- hdu
- hdu
- hdu
- HDU
- ThreadLocal
- Django学习笔记三:页面侧边栏最新文章,文章归档,分类,标签云的实现
- 合成复用原则
- 做回正常人
- 吐血推荐珍藏的Chrome插件
- 【HDU
- 浅读《大话数据结构》(2)
- Spring IoC容器
- HDU-6035 Colorful Tree(树型dp)
- empy catkin_pkg
- Python list
- 推荐引擎—概述
- python求解给定一字符串列表判定每个字符串可以构成的所有序列中回文序列的数目
- MySQL学习笔记-表