R - Dividing 多重背包
来源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 多重背包的更多相关文章
- hdu 1059 Dividing(多重背包优化)
Dividing Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- 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 ...
- Dividing 多重背包 倍增DP
Dividing 给出n个物品的价值和数量,问是否能够平分.
- hdu 1059 Dividing 多重背包
点击打开链接链接 Dividing Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- POJ 1014 Dividing(多重背包, 倍增优化)
Q: 倍增优化后, 还是有重复的元素, 怎么办 A: 假定重复的元素比较少, 不用考虑 Description Marsha and Bill own a collection of marbles. ...
- POJ 1014 / HDU 1059 Dividing 多重背包+二进制分解
Problem Description Marsha and Bill own a collection of marbles. They want to split the collection a ...
- hdu1059 Dividing ——多重背包
link:http://acm.hdu.edu.cn/showproblem.php?pid=1059 最简单的那种 #include <iostream> #include <cs ...
- POJ 1014 Dividing 多重背包
Dividing Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 63980 Accepted: 16591 Descri ...
- poj1014 hdu1059 Dividing 多重背包
有价值为1~6的宝物各num[i]个,求能否分成价值相等的两部分. #include <iostream> #include <cstring> #include <st ...
随机推荐
- gdb调试动态链接so
http://blog.csdn.net/weed_hz/article/details/12710429 gdb) file <你的exe>(gdb) load <你的so> ...
- C# StreamReader.ReadLine统计行数的问题
要实现一个功能: 从 lua 文件中提取字符串放到 excel 中,再将 excel 给海外同事,翻译完成后,用翻译的文本替换相应中文. 整个功能并不复杂,要点有二点: 1.提取字符串,一行中文如&q ...
- 为Ubuntu新创建用户创建默认.bashrc并自动加载
首先,su – 到新创建的用户 拷贝默认的.bashrc过来 1 cp /etc/skel/.bashrc ~/ 然后创建.profile文件 1 vi ~/.profile 粘贴下面的内容 ...
- 集群安装Java环境
需要安装一个集群环境,发现全部要手动安装java.记录下安装Java环境的过程.虽然,依旧是挨个安装,但总算是有体系了. java 找到下载地址: https://www.oracle.com/tec ...
- Spring Core Programming(Spring核心编程) - AOP Concepts(AOP基本概念)
1. What is aspect-oriented programming?(什么是面向切面编程?) Aspects help to modularize cross-cutting concern ...
- github远程建了分支,本地看不到的问题
原因:Git branch -a 查看的是本地仓库的所有分支 远程新建的没有同步前 就是看不到 解决:$git checkout master //首先切到master分支 $git pull ...
- 再看C# ThreadPool与Task的认识总结
工作线程与I/O线程 在ThreadPool中有这样一个方法: public static bool SetMaxThreads(int workerThreads, int completi ...
- 先从一个 libev 的 demo 入手
最近想研究下 libev 这个网络库,所以先从官方文档一个最简单的 demo 开始,代码如下: //io.c // a single header file is required #include ...
- CentOS 7.2编译安装PHP7
原文: https://typecodes.com/web/centos7compilephp7.html?utm_source=tuicool&utm_medium=referralPHP官 ...
- Implementation of Message Receiver