来源poj1059

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 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.

把让你分成两堆价值相同的石子,把他的价值也当做消耗去做

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include <iomanip>
#include<cmath>
#include<float.h>
#include<string.h>
#include<algorithm>
#define sf scanf
#define pf printf
#define scf(x) scanf("%d",&x)
#define scff(x,y) scanf("%d%d",&x,&y)
#define prf(x) printf("%d\n",x)
#define mm(x,b) memset((x),(b),sizeof(x))
#include<vector>
#include<queue>
#include<map>
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=a;i>=n;i--)
typedef long long ll;
const ll mod=1e9+7;
const double eps=1e-8;
const int inf=0x3f3f3f3f;
using namespace std;
const double pi=acos(-1.0);
const int N=5e5+10;
int dp[N];
int num[7];
int main()
{
int cas=1;
while(1)
{
int sum=0;
rep(i,1,7)
{
scf(num[i]);
sum+=i*num[i];
}
if(sum==0) return 0;
if(sum&1)
{
pf("Collection #%d:\nCan't be divided.\n\n",cas++); continue;
}
sum/=2;
int cnt=0;
mm(dp,0);
dp[0]=1;
rep(i,1,7)
{
if(!num[i]) continue;
for(int j=1;j<=num[i];j*=2)//二进制优化
{
num[i]-=j;
int ans=j*i;
per(k,sum,ans)
if(dp[k-ans])
dp[k]=1;
}
int ans=num[i]*i;
if(ans)
per(j,sum,ans)
if(dp[j-ans])
dp[j]=1;
}
if(dp[sum])
pf("Collection #%d:\nCan be divided.\n\n",cas++);
else
pf("Collection #%d:\nCan't be divided.\n\n",cas++);
}
}
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include <iomanip>
#include<cmath>
#include<float.h>
#include<string.h>
#include<algorithm>
#define sf scanf
#define pf printf
#define scf(x) scanf("%d",&x)
#define scff(x,y) scanf("%d%d",&x,&y)
#define prf(x) printf("%d\n",x)
#define mm(x,b) memset((x),(b),sizeof(x))
#include<vector>
#include<queue>
#include<map>
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=a;i>=n;i--)
typedef long long ll;
const ll mod=1e9+7;
const double eps=1e-8;
const int inf=0x3f3f3f3f;
using namespace std;
const double pi=acos(-1.0);
const int N=5e5+10;
int dp[N];
int tot;
int num[7];
void bag01(int cost,int val)
{
per(i,tot,cost)
dp[i]=max(dp[i],dp[i-cost]+val);
}
void bagall(int cost,int val)
{
rep(i,cost,tot+1)
dp[i]=max(dp[i],dp[i-cost]+val);
}
void multbag(int cost,int val,int n)
{
if(cost*n>tot)
{
bagall(cost,val);
return;
}
int k=1;
while(k<n)
{
n-=k;
bag01(k*cost,k*val);
k*=2;
}
bag01(n*cost,n*val);
}
int main()
{
int cas=1;
while(1)
{
tot=0;
rep(i,1,7)
{
scf(num[i]);
tot+=i*num[i];
}
if(tot==0) return 0;
if(tot&1)
{
pf("Collection #%d:\nCan't be divided.\n\n",cas++); continue;
}
tot/=2;
mm(dp,0);
rep(i,1,7)
{
if(!num[i]) continue;
multbag(i,i,num[i]);
}
if(tot==dp[tot])
pf("Collection #%d:\nCan be divided.\n\n",cas++);
else
pf("Collection #%d:\nCan't be divided.\n\n",cas++);
}
}

R - Dividing 多重背包的更多相关文章

  1. hdu 1059 Dividing(多重背包优化)

    Dividing Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  2. Hdu 1059 Dividing & Zoj 1149 & poj 1014 Dividing(多重背包)

    多重背包模板- #include <stdio.h> #include <string.h> int a[7]; int f[100005]; int v, k; void Z ...

  3. Dividing 多重背包 倍增DP

    Dividing 给出n个物品的价值和数量,问是否能够平分.

  4. hdu 1059 Dividing 多重背包

    点击打开链接链接 Dividing Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  5. POJ 1014 Dividing(多重背包, 倍增优化)

    Q: 倍增优化后, 还是有重复的元素, 怎么办 A: 假定重复的元素比较少, 不用考虑 Description Marsha and Bill own a collection of marbles. ...

  6. POJ 1014 / HDU 1059 Dividing 多重背包+二进制分解

    Problem Description Marsha and Bill own a collection of marbles. They want to split the collection a ...

  7. hdu1059 Dividing ——多重背包

    link:http://acm.hdu.edu.cn/showproblem.php?pid=1059 最简单的那种 #include <iostream> #include <cs ...

  8. POJ 1014 Dividing 多重背包

    Dividing Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 63980   Accepted: 16591 Descri ...

  9. poj1014 hdu1059 Dividing 多重背包

    有价值为1~6的宝物各num[i]个,求能否分成价值相等的两部分. #include <iostream> #include <cstring> #include <st ...

随机推荐

  1. Linux如何快速跳转到文档开头或者末尾

    输入 gg 命令,光标会移动到文档开头 : 输入 G 命令,光标会移动到文档末尾: 另外可以敲击 上下键.Page UP.Page Down 键快速查看文档:

  2. 【黑魔法】Covering Indexes、STRAIGHT_JOIN

    今天给大家介绍两个黑魔法,这都是压箱底的法宝.大家在使用时,一定要弄清他们的适用场景及用法,用好了,就是一把开天斧,用不好那就是画蛇添足.自从看过耗子哥(左耳朵耗子)的博客,都会给对相应专题有兴趣的小 ...

  3. TensorFlow相关

    TensorFlow的55个经典案例(转) https://blog.csdn.net/xzy_thu/article/details/76220654 随笔分类 - 数据挖掘及机器学习  www.c ...

  4. JAVA中调用LevelDB用于Linux和Window环境下快速存储KV结构

    一.简介 JAVA中调用LevelDB用于Linux和Window环境下快速存储KV结构 二.依赖 <!-- https://mvnrepository.com/artifact/org.fus ...

  5. H5调用本地摄像头[转]

    http://www.cnblogs.com/GoodPingGe/p/4726126.html <!DOCTYPE html><html><head lang=&quo ...

  6. 每天一个linux命令(17):whereis

    1.命令简介         whereis (whereis) 命令用来定位指令的二进制程序.源代码文件和man手册页等相关文件的路径.         whereis命令只能用于程序名的搜索,而且 ...

  7. 在Ubuntu18.04下配置HBase

    HBase在HDFS基础上提供了高可靠, 列存储, 可扩展的数据库系统. HBase仅能通过主键(row key)和主键的range来检索数据, 主要用来存储非结构化和半结构化的松散数据. 与Hado ...

  8. SuperObject生成示例

    var jo,jEntity,jSubEntity: ISuperObject; jaOrder,jaEntity,jaSubEntity: ISuperObject; i,j,entityCount ...

  9. 【转载】浅谈事件冒泡与事件捕获 - javascript 事件代理

    原文:https://segmentfault.com/a/1190000000749838 事件冒泡与事件捕获 事件冒泡和事件捕获分别由微软和网景公司提出,这两个概念都是为了解决页面中事件流(事件发 ...

  10. JSON.stringify转化报错

    两种方式会导致该错误:1.json格式数据存在循环调用.   举个例子: var obj = { title: '标题'}obj.content = obj;JSON.stringify(obj); ...