题目:

有两个小朋友想要平分一大堆糖果,但他们不知道如何平分需要你的帮助,由于没有spj我们只需回答能否平分即可。

糖果大小有6种分别是1、2、3、4、5、6,每种若干颗,现在需要知道能不能将这些糖果分成等额的两堆。

一颗大小为6的糖果,可以相当于2颗大小为3的糖果,其他同理,即大小满足加法,但是1颗糖果是不能被拆分的。

Input

多组输入,每行输入6个非负整数,分别表示大小为1、2、3、4、5、6的糖果的数量,若输入6个0代表输入结束。

单种糖果的数量不会超过20000。

Output

每组询问先输出一行 "Collection #k:",k表示第几组询问。

再输出一行表示答案,若能分割,输出 “Can be divided.”,若不能输出 ”Can't be divided.“

每组输出后空一行

Sample Input

1 0 1 2 0 0
1 0 0 0 1 1
0 0 0 0 0 0

Sample Output

Collection #1:
Can't be divided. Collection #2:
Can be divided.

题解:

这道题原本以为是一个思路题,没去想算法,,,其实这道题用多重背包dp套一下模板就可以了

首先求一下所有糖果的总价值sum

如果sum不是一个偶数,那就直接输出(糖果总价值都是奇数,那就肯定不可能平分)

Can't be divided.

每一个糖果有一个价值,这些糖果还有数量,那么就把糖果的价值看成重量,,,对背包总容量sum/2跑一遍多重背包dp

我们只需要最后的结果dp[sum/2]==sum/2那么就输出

Can be divided.

因为我们把糖果的价值看成了容量,那么dp[sum/2]就相当于容量为sum/2的背包能获得的最大价值,如果dp[sum/2]==sum/2,那么也就说明了可以用一些糖果来装满容量为sum/2的背包

dp数组开多大?因为每种糖果最多20000,那么6*20000=120000,我们开1000000肯定够用

代码1(交的G++):

 1 #include<stdio.h>
2 #include<iostream>
3 #include<cstring>
4 using namespace std;
5 int dp[1000000],a[20],sum;
6 void DP(int cost,int num)
7 {
8 int i;
9 if(cost*num>=sum) //完全背包模板
10 {
11 //如果cost*num大于sum的话,那也就相当于完全背包了
12 for(i=cost;i<=sum;i++)
13 dp[i]=max(dp[i],dp[i-cost]+cost);
14 return ;
15 }
16
17 //下面代码是二进制枚举
18 int k=1;
19 while(k<num)
20 {
21 for(i=sum;i>=k*cost;i--)
22 dp[i]=max(dp[i],dp[i-cost*k]+cost*k);
23 num-=k;
24 k*=2;
25 }
26 //如果二进制枚举后还有剩余,那就把剩下的当为一个整体,用01背包模板枚举
27 for(i=sum;i>=num*cost;i--)
28 dp[i]=max(dp[i],dp[i-cost*num]+cost*num);
29 }
30 int main(void)
31 {
32 int pt=1,i,j;
33 while(cin>>a[1]>>a[2]>>a[3]>>a[4]>>a[5]>>a[6])
34 {
35 if(!a[1]&&!a[2]&&!a[3]&&!a[4]&&!a[5]&&!a[6]) break;
36 sum=0;
37 for(i=1;i<=6;i++) sum+=a[i]*i;
38 printf("Collection #%d:\n",pt++);
39 if(sum%2)
40 {
41 printf("Can't be divided.\n\n");
42 continue;
43 }
44 sum/=2;
45 memset(dp,0,sizeof(dp));
46 for(i=1;i<=6;i++) //这个for循环相当于枚举物品
47 DP(i,a[i]);
48 if(dp[sum]==sum) printf("Can be divided.\n\n");
49 else printf("Can't be divided.\n\n");
50 }
51 return 0;
52 }

代码2:

 1 #include<stdio.h>
2 #include<iostream>
3 #include<cstring>
4 using namespace std;
5 struct shudui
6 {
7 int c,p;
8 }rice[10];
9 int dp[1000000];
10 int main()
11 {
12 int a,b,c,d,e,cnt=0;
13 rice[1].p=1;
14 rice[2].p=2;
15 rice[3].p=3;
16 rice[4].p=4;
17 rice[5].p=5;
18 rice[6].p=6;
19 while(~scanf("%d%d%d%d%d%d",&rice[1].c,&rice[2].c,&rice[3].c,&rice[4].c,&rice[5].c,&rice[6].c))
20 {
21 int sum=rice[1].c+rice[2].c*2+rice[3].c*3+rice[4].c*4+rice[5].c*5+rice[6].c*6;
22 if(rice[1].c==0 && rice[2].c==0 && rice[3].c==0 && rice[4].c==0 && rice[5].c==0 && rice[6].c==0) return 0;
23 printf("Collection #%d:\n",++cnt);
24
25 if(sum%2) //一定要加这个判断
26 {
27 printf("Can't be divided.\n\n");
28 continue;
29 }
30 sum/=2;
31 memset( dp, 0, sizeof( dp ) );
32 for( int i = 1; i <= 6; i++ ) //枚举物品
33 {
34 int p = 1;
35 while( p < rice[i].c ) //把物品二进制分开
36 {
37 for( int j = sum; j >= rice[i].p * p; j-- )
38 if( dp[j] < dp[j - rice[i].p * p] + rice[i].p * p)
39 dp[j] = dp[j - rice[i].p * p] + rice[i].p * p;
40
41 rice[i].c -= p;
42 p <<= 1; //相当于乘与2
43 }
44 for( int j = sum; j >= rice[i].p * rice[i].c; j-- ) //把二进制枚举后剩下的物品看成一个整体采用01背包
45 if( dp[j] < dp[j - rice[i].p * rice[i].c] + rice[i].p * rice[i].c )
46 dp[j] = dp[j - rice[i].p * rice[i].c] + rice[i].p * rice[i].c;
47 }
48 if(dp[sum]==sum)
49 {
50 printf("Can be divided.\n");
51 }
52 else
53 {
54 printf("Can't be divided.\n");
55 }
56 printf("\n");
57 }
58 return 0;
59 }

HDU - 1059 背包dp的更多相关文章

  1. HDOJ(HDU).1059 Dividing(DP 多重背包+二进制优化)

    HDOJ(HDU).1059 Dividing(DP 多重背包+二进制优化) 题意分析 给出一系列的石头的数量,然后问石头能否被平分成为价值相等的2份.首先可以确定的是如果石头的价值总和为奇数的话,那 ...

  2. hdu 1171 Big Event in HDU(背包DP)

    题意: 杭电搬迁,有N种设备,每种设备有个价值V,数量M,要求将这些设备平分,使得平分后两边的总价值尽可能地相等. 输出两边各自的总价值. 思路: 背包DP后,P=所有的总价值/2,然后从P开始往两边 ...

  3. HDU 1059 Dividing (dp)

    题目链接 Problem Description Marsha and Bill own a collection of marbles. They want to split the collect ...

  4. HDU-1171 Big Event in HDU(生成函数/背包dp)

    题意 给出物品种类,物品单价,每种物品的数量,尽可能把其分成价值相等的两部分. 思路 背包的思路显然是用一半总价值当作背包容量. 生成函数则是构造形如$1+x^{w[i]}+x^{2*w[i]}+.. ...

  5. hdu 5534 Partial Tree 背包DP

    Partial Tree Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid= ...

  6. HDU 5501 The Highest Mark 背包dp

    The Highest Mark Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?p ...

  7. HDU 1011 树形背包(DP) Starship Troopers

    题目链接:  HDU 1011 树形背包(DP) Starship Troopers 题意:  地图中有一些房间, 每个房间有一定的bugs和得到brains的可能性值, 一个人带领m支军队从入口(房 ...

  8. HDU 1011 Starship Troopers 树形+背包dp

    http://acm.hdu.edu.cn/showproblem.php?pid=1011   题意:每个节点有两个值bug和brain,当清扫该节点的所有bug时就得到brain值,只有当父节点被 ...

  9. hdu 5234 Happy birthday 背包 dp

    Happy birthday Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?p ...

随机推荐

  1. Mac安装homebrew,postman,charles

    Homebrew是一款Mac OS平台下的软件包管理工具,拥有安装.卸载.更新.查看.搜索等很多实用的功能.简单的一条指令,就可以实现包管理,而不用你关心各种依赖和文件路径的情况,十分方便快捷. 1. ...

  2. Jenkins自动部署spring boot

    Jenkins自动部署spring boot 背景介绍 本公司属于微小型企业,初期业务量不高,所有程序都写在一个maven项目里面,不过是多模块开发. 分了login模块,service模块,cms模 ...

  3. linux搭建简单samba服务器

    1.安装需要的软体 yum install -y samba samba-client samba-common 2.创建samba需要的本地用户,创建samba服务使用的目录 Linux系统文件的读 ...

  4. linux下删除文件夹及下面所有文件

    使用rm -rf 目录名字 命令即可 -r 就是向下递归,不管有多少级目录,一并删除-f 就是直接强行删除,不作任何提示的意思 rm 不带参数 只能删除文件 rm test.txt mkdir /us ...

  5. Spring Bean详解

    Spring Bean 在Spring的应用中,Spring IoC容器可以创建.装配和配置应用组件对象,这里的组件对象称为Bean. Bean的配置 Spring可以看作一个大型工厂,用于生产和管理 ...

  6. 输入5V,输出5V限流芯片,4A限流,短路保护

    USB限流芯片,5V输入,输出5V电压,限流值可以通过外围电阻进行调节,PWCHIP产品中可在限流范围0.4A-4.8A,并具有过压关闭保护功能. 过压关闭保护: 如芯片:PW1555,USB我们一半 ...

  7. 1.2V转3.3V芯片电路图,超简电路

    镍氢可充电电池1.2V转成3.3V的电路和电子产品很多,在实际适用中,即使是两节镍氢电池串联供电也是会有供电电压下降和不稳定的影响,这是因为电池电量减少,而导致电池的电压也是会随着降低. 一般情况下, ...

  8. Spring-01-事务

    Spring事务机制 spring事务机制最重要的两个配置项,隔离级别和传播特性. 1. 隔离级别 隔离级别针对高并发问题导致的数据库丢失更新问题 1.1 数据库的4大基本特征 原子性(Atomic) ...

  9. Shell从入门到精通

    熟悉基本shell操作不仅是运维的基本功,对于开发来说也是多多益善,我在学习的过程中,总结了十个练手的小demo,并附上涉及的知识点,仅供娱乐. 1. 多线程ping监控,检查同一网段的IP是否连通 ...

  10. 13 | 实战:单机如何实现管理百万主机的心跳服务? https://time.geekbang.org/column/article/240656

    13 | 实战:单机如何实现管理百万主机的心跳服务? https://time.geekbang.org/column/article/240656