【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. 
Input
Each line in the input describes one collection of marbles to be divided. The lines consist of six non-negative integers n1, n2, ..., n6, where ni is the number of marbles of value i. So, the example from above would be described by the input-line ``1 0 1 2 0 0''. The maximum total number of marbles will be 20000. 

The last line of the input file will be ``0 0 0 0 0 0''; do not process this line. 
Output
For each colletcion, output ``Collection #k:'', where k is the number of the test case, and then either ``Can be divided.'' or ``Can't be divided.''. 

Output a blank line after each test case. 
Sample Input
1 0 1 2 0 01 0 0 0 1 10 0 0 0 0 0
Sample Output
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;}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 车遮阳板松了怎么办 洗车把内饰划了怎么办 新车销售没销量怎么办 住院时间重叠了怎么办 长安cs75油耗高怎么办 墙内线烧了怎么办 如果没买票想进高铁站怎么办 老赖拒绝还款怎么办 gta5资产不兼容怎么办 平板黑屏闪退怎么办 施工证学历不够怎么办 隧道放炮声大怎么办 58工作被骗了怎么办 学历国家不承认怎么办 福州居住证一年到期怎么办 居住证过期2年怎么办 被房东坑了怎么办 房东违反了合同怎么办 上海居住证过期了怎么办 地铁卡消磁了怎么办 学生卡消磁了怎么办 家属院没房产证怎么办 邮箱收不到邮件怎么办 大学宿舍八人间怎么办 高中档案袋拆了怎么办 公派教师回国后怎么办? 事业单位辞职后档案怎么办 学信支付不了怎么办 校外怎么办北邮校园卡 报考身份证丢了怎么办 买房怎么办不取消低保 自考找不到真题怎么办 自考生考研没有档案怎么办 自考本科无学位怎么办 自考学位证书没拿到怎么办 自考毕业证出生日期错误怎么办 成考没有学位证怎么办 评职称学历认证怎么办 国家不承认学历怎么办 高考分数错了怎么办 签合同了不想干怎么办