来源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. 用GO开发企业级分布式云存储系统

    一.基础架构 二.开发工具

  2. 每天一个linux命令:free

    1.命令简介 free (free) 命令可以显示Linux系统中空闲的.已用的物理内存及swap内存,及被内核使用的buffer. 2.用法 free [-b | -k | -m | -g | -h ...

  3. NOIP2010普及组 导弹拦截

    导弹拦截 OJ地址: https://www.luogu.org/problemnew/show/P1158 http://codevs.cn/problem/1128/   题目描述 Descrip ...

  4. Android ANR的产生与分析

      ANR即Application Not Responding应用无响应,一般在ANR的时候会弹出一个应用无响应对话框.也许有些开发者在使用某些手机开发中不在弹出应用无响应弹出框,特别是国产手机An ...

  5. Future、FutureTask实现原理浅析(源码解读)

    前言 最近一直在看JUC下面的一些东西,发现很多东西都是以前用过,但是真是到原理层面自己还是很欠缺. 刚好趁这段时间不太忙,回来了便一点点学习总结. 前言 最近一直在看JUC下面的一些东西,发现很多东 ...

  6. Atitit 酷奇的押金危机 遇到资金链断裂作为创始人应该怎么办

    Atitit 酷奇的押金危机  遇到资金链断裂作为创始人应该怎么办 遇到对方确实经营不善,资产已经还不了用户的押金怎么办?? 1. 一些重要原则 1 1.1. 二次分配原则  公平原则 1 1.2. ...

  7. Jquery Post提交时Content-Type的不同取值详解

    四种常见的 POST 提交数据方式 我们知道,HTTP 协议是以 ASCII 码传输,建立在 TCP/IP 协议之上的应用层规范.规范把 HTTP 请求分为三个部分:状态行.请求头.消息主体.类似于下 ...

  8. hive hbase区别

    1.hive是sql语言,通过数据库的方式来操作hdfs文件系统,为了简化编程,底层计算方式为mapreduce. 2.hive是面向行存储的数据库. 3.Hive本身不存储和计算数据,它完全依赖于H ...

  9. 【Wildfly】从默认的自动重启修改为手动重启

    最近在使用Wildfly作为Web服务器,用的是10.0.0版本.默认情况下,Wildfly的部署方式是通过将项目放到%WILDFLY_HOME%\standalone\deployments下的,然 ...

  10. 下载Chrome商店和Youtube资源

    下载chrome浏览器插件 站点:http://cooal.cn/crx.php 操作步骤: 1.打开扩展介绍页面 (在 三道杠图标>工具>扩展程序 里相应扩展的"访问网站&qu ...