hdu1059&poj1014 Dividing (dp,多重背包的二分优化)
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.
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.
``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.
#include <bits/stdc++.h> using namespace std;
int num[],sum,v,cnt,i,j;
bool dp[];//dp[i]表示容量为i的背包能否装满
int main()
{
//freopen("de.txt","r",stdin);
int casenum=;
while ()
{
memset(dp,,sizeof dp);
memset(num,,sizeof num);
sum=;
for (i=;i<=;++i)
{
scanf("%d",&num[i]);
sum+=i*num[i];
}
if (sum==)
break;
printf("Collection #%d:\n",casenum++);
if (sum%)//如果所有石头总价值和为奇数肯定不能均分
{
printf("Can't be divided.\n\n");
continue;
}
else
{
v=sum/;//用总价值的一半来作为背包的容量
dp[]=;
for (i=;i<=;++i)
{
if (num[i]==)
continue;
for (j=;j<=num[i];j*=)//j来作为2^n的单位
{
cnt=i*j;
for (int k=v;k>=cnt;--k)
{
if (dp[k-cnt])//只有k-cnt的背包被装满,k的背包才能被装满
dp[k]=;
}
num[i]-=j;//分完2^n剩下的个数
}
cnt=num[i]*i;
if (cnt)
{
for (int k=v;k>=cnt;--k)
{
if (dp[k-cnt])
dp[k]=;
}
}
}
if (dp[v])//容量为v的背包能否被装满
printf("Can be divided.\n\n");
else
printf("Can't be divided.\n\n");
}
}
return ;
}
hdu1059&poj1014 Dividing (dp,多重背包的二分优化)的更多相关文章
- HDOJ(HDU).1059 Dividing(DP 多重背包+二进制优化)
HDOJ(HDU).1059 Dividing(DP 多重背包+二进制优化) 题意分析 给出一系列的石头的数量,然后问石头能否被平分成为价值相等的2份.首先可以确定的是如果石头的价值总和为奇数的话,那 ...
- 硬币问题 (dp,多重背包的二分优化)
题目描述 给你n种硬币,知道每种的面值Ai和每种的数量Ci.问能凑出多少种不大于m的面值. 输入 有多组数据,每一组第一行有两个整数 n(1≤n≤100)和m(m≤100000),第二行有2n个整数, ...
- poj1014 Dividing (多重背包)
转载请注明出处:http://blog.csdn.net/u012860063 题目链接:id=1014">http://poj.org/problem?id=1014 Descrip ...
- CodeForces922E DP//多重背包的二进制优化
https://cn.vjudge.net/problem/1365218/origin 题意 一条直线上有n棵树 每棵树上有ci只鸟 在一棵树底下召唤一只鸟的魔法代价是costi 每召唤一只鸟,魔法 ...
- POJ1014:Dividing(多重背包)
http://poj.org/problem?id=1014 Description Marsha and Bill own a collection of marbles. They want to ...
- HDOJ(HDU).2844 Coins (DP 多重背包+二进制优化)
HDOJ(HDU).2844 Coins (DP 多重背包+二进制优化) 题意分析 先把每种硬币按照二进制拆分好,然后做01背包即可.需要注意的是本题只需要求解可以凑出几种金钱的价格,而不需要输出种数 ...
- HDOJ(HDU).2191. 悼念512汶川大地震遇难同胞――珍惜现在,感恩生活 (DP 多重背包+二进制优化)
HDOJ(HDU).2191. 悼念512汶川大地震遇难同胞――珍惜现在,感恩生活 (DP 多重背包+二进制优化) 题意分析 首先C表示测试数据的组数,然后给出经费的金额和大米的种类.接着是每袋大米的 ...
- HDU 1059(多重背包加二进制优化)
http://acm.hdu.edu.cn/showproblem.php?pid=1059 Dividing Time Limit: 2000/1000 MS (Java/Others) Me ...
- 动态规划:HDU2844-Coins(多重背包的二进制优化)
Coins Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
随机推荐
- Angular JS - 3 - Angular JS 双向数据绑定
一 .数据绑定 1. 数据绑定: 数据从一个地方A转移(传递)到另一个地方B, 而且这个操作由框架来完成2. 双向数据绑定: 数据可以从View(视图层)流向Model(模型,也就是数据), 也可以从 ...
- iOS设计模式之工厂模式
一,什么是工厂模式 模式定义: “专门定义一个类来负责创建其他类的实例,被创建的实例通常具有共同的父类.” 世界上就是由一个工厂类,根据传入的参数,动态地决定创建出哪一个产品类的实例. 需求场景: 简 ...
- 【BZOJ2555】SubString(后缀自动机,LCT)
题意:给你一个字符串init,要求你支持两个操作 (1):在当前字符串的后面插入一个字符串 (2):询问字符串s在当前字符串中出现了几次?(作为连续子串) 你必须在线支持这些操作. 长度 <= ...
- C#将Json字符串转化为对象
实体类: public class CheckData { public string msg; public string code; public string data; public stri ...
- Critical Links
UVA 796 Critical Links http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82833#overview 题目大意:给你一 ...
- iOS 获取全局唯一标示符
这个方法用来产生一个唯一的标示符,每次调用都会不一样,所以可以用当作一些临时缓存文件的名字 NSString *identifier = [[NSProcessInfo processInfo] gl ...
- JS继承 实现方式
JS中继承方式的实现有多种方法,下面是比较推荐的方法,其它继承方式可做了解: function object(o) { function F() {} F.prototype = o; return ...
- CATiledLayer显示超大图片的解决方案
先对图片进行了裁剪 -> 很多小图片, 然后再根据显示 进行绘制 - (void)viewDidLoad { [super viewDidLoad]; [self cutImageAndSave ...
- Python做简单的字符串匹配详解
Python做简单的字符串匹配详解 由于需要在半结构化的文本数据中提取一些特定格式的字段.数据辅助挖掘分析工作,以往都是使用Matlab工具进行结构化数据处理的建模,matlab擅长矩阵处理.结构化数 ...
- DT时代,如何成为十字复合型数据分析师
DT时代,如何成为十字复合型数据分析师 当前社会正从IT到DT智能时代,传统行业嫁接互联网,产生的是加法效应:大数据创新驱动,产生的是乘法效应,价值呈指数递增.DT时代拼的是人才和创新价值的能力,拼的 ...