hdu 1059 Dividing
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 19391 Accepted Submission(s): 5446
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.
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.
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.
Collection #2:
Can be divided.
#include <cstdio>
#include <cstring>
#include <queue>
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std ;
int dp[] ;
int r[] ;
int sum, num ;
int c = ;
void _zeroone(int c, int w)//0-1背包处理单件物品
{
for(int i = sum; i >= c; --i)
dp[i] = max(dp[i], dp[i - c] + w) ;
}
void _compl(int c, int w)//完全背包处理单件物品
{
for(int i = c; i <= sum; ++i)
dp[i] = max(dp[i], dp[i - c] + w) ;
}
void _mult(int c, int w, int amount)
{
if(c * amount >= sum) { _compl(c, w) ; return ; }//满足条件时,该件物品可以直接当完全背包时的单件物品处理
int k = ;
while(k < amount)//二进制分解
{
_zeroone(c * k,w * k) ;
amount -= k ;
k = k * ;
}
_zeroone(amount * c, amount * w) ;
}
int main()
{
while()
{
memset(dp, , sizeof dp) ;
sum = ;
int flag = ;
for(int i = ; i <= ; ++i){
scanf("%d",&r[i]) ;
if(r[i] != ) flag = ;
sum += i * r[i] ;
}
if(!flag) break ;
printf("Collection #%d:\n",c++) ;
if(sum & ) { printf("Can't be divided.\n\n") ; continue ;}
sum /= ;
for(int i = ; i <= ; ++i)//将多重背包每件分开转换为完全背包或0-1背包中的单件物品处理
_mult(i,i,r[i]) ;
if(dp[sum] == sum ) printf("Can be divided.\n") ;
else printf("Can't be divided.\n") ;
printf("\n") ;
}
return ;
}
hdu 1059 Dividing的更多相关文章
- HDOJ(HDU).1059 Dividing(DP 多重背包+二进制优化)
HDOJ(HDU).1059 Dividing(DP 多重背包+二进制优化) 题意分析 给出一系列的石头的数量,然后问石头能否被平分成为价值相等的2份.首先可以确定的是如果石头的价值总和为奇数的话,那 ...
- hdu 1059 Dividing bitset 多重背包
bitset做法 #include <bits/stdc++.h> #define PI acos(-1.0) #define mem(a,b) memset((a),b,sizeof(a ...
- 动态规划--模板--hdu 1059 Dividing
Dividing Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- hdu 1059 Dividing 多重背包
点击打开链接链接 Dividing Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- HDU 1059 Dividing 分配(多重背包,母函数)
题意: 两个人共同收藏了一些石头,现在要分道扬镳,得分资产了,石头具有不同的收藏价值,分别为1.2.3.4.5.6共6个价钱.问:是否能公平分配? 输入: 每行为一个测试例子,每行包括6个数字,分别对 ...
- hdu 1059 Dividing(多重背包优化)
Dividing Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- HDU 1059 Dividing(多重背包)
点我看题目 题意: 将大理石的重量分为六个等级,每个等级所在的数字代表这个等级的大理石的数量,如果是0说明这个重量的大理石没有.将其按重量分成两份,看能否分成. 思路 :一开始以为是简单的01背包,结 ...
- 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 ...
- HDU 1059 Dividing (dp)
题目链接 Problem Description Marsha and Bill own a collection of marbles. They want to split the collect ...
随机推荐
- 根据OSG中的ref_ptr和Reference简化的智能指针
main.cpp测试代码 #include "TestSmartPointer" void fun() { SP<TestSmartPointer> sp1=new T ...
- SQL TO LINQ(Linqer神器)
此软件可以把SQL语句转换成LINQ语句 首先把Linqer下载到本地, 1.在VS中创建.dbml文件和.cs文件 打开VS,创建一个控制台项目即可,再添加一个dbml项目 2.添加连接数据库 3. ...
- python基础——模块
python基础——模块 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文 ...
- android bitmap的放大缩小
private static Bitmap big(Bitmap bitmap) { Matrix matrix = new Matrix(); matrix.postScale(1.5f,1.5f) ...
- Android四种LaunchMode
singleTop 的Activity和standard的几乎一样, 把singleTop和standard归为一类启动模式,这种模式不会引起任务栈的变更 singleTop和standard唯一的区 ...
- Loadrunner中Throughput(吞吐量)的分析与计算
Throughput翻译为吞吐量,按照常规理解网络吞吐量表示在单位时间内通过网卡数据量之和,其中即包括本机网卡发送出去的数据量也包括本机网卡接收到的数据量,但这个理解在Loadrunner记录的Thr ...
- EditPlus
# 批量更改文件编码 原文:EditPlus批量更改文件编码 # 标签位置设置到顶部 工具-参数设置-布局-文档选择器-位置
- Spring.Net的IOC入门
1.构造器注入 namespace Spring.Net { class Program { //构造器注入 static void Main(string[] args) { IApplicatio ...
- 【JAVA Properties类概述】
一.概述. 之前说过,该对象是和IO流相结合的技术,所以和IO流结合在一起来讲比较合适. public class Propertiesextends Hashtable<Object,Obje ...
- 《linux系统及其编程》实验课记录(六)
实验 6:Linux 文件系统 实验环境: 安装了 Red Hat Enterprise Linux 6.0 可运行系统,并且是成功验证系统.有另外一个无特权用户 student,密码 student ...