【二进制拆分多重背包】【HDU1059】【Dividing】
Dividing
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 18190 Accepted Submission(s): 5080
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.
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 a blank line after each test case.
1 0 1 2 0 0
1 0 0 0 1 1
0 0 0 0 0 0
Collection #1:
Can't be divided. Collection #2:
Can be divided.
一开始还觉得有点难写。。
后来AC才感觉自己编码能力已经很强了。。
主要是这个拆分函数就OK了
void solve()
{
for(int i=1;i<=6;i++)
{
int temp=0;
while(n[i]>0)
{
if(n[i]>=ER[temp])
A[++tot]=i*ER[temp];
else
A[++tot]=i*n[i];
n[i]=n[i]-A[tot]/i;
temp++;
}
}
}
完整代码如下:
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <ctime>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <string>
#define oo 0x13131313
#define MAX 2100000000
using namespace std;
void init()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
}
int n[10];
int F[100001];
int ER[100];
int K;
int A[600];
int tot=0; //总数
void YCL()
{
memset(F,0,sizeof(F));
tot=0;
K=0;
for(int i=1;i<=6;i++)
{
K+=i*n[i];
}
for(int i=1;i<=K/2;i++)
F[i]=MAX;
F[0]=0;
}
void ER1()
{
ER[0]=1;
for(int i=1;i<=15;i++)
{
ER[i]=ER[i-1]*2;
}
}
void solve()
{
for(int i=1;i<=6;i++)
{
int temp=0;
while(n[i]>0)
{
if(n[i]>=ER[temp])
A[++tot]=i*ER[temp];
else
A[++tot]=i*n[i];
n[i]=n[i]-A[tot]/i;
temp++;
}
}
}
int main()
{
// init();
int CASE=0;
ER1(); //得到二的倍数
while(cin>>n[1]>>n[2]>>n[3]>>n[4]>>n[5]>>n[6]&&(n[1]||n[2]||n[3]||n[4]||n[5]||n[6]))
{
CASE++;
YCL(); //计算K
solve(); //拆分开始
if(K%2==0)
{
for(int i=1;i<=tot;i++)
for(int j=K/2;j>=0;j--)
{
if(j-A[i]>=0)
F[j]=min(F[j],F[j-A[i]]);
}
printf("Collection #%d:\n",CASE);
if(F[K/2]!=MAX)
{
printf("Can be divided.\n\n");
}
else
{
printf("Can't be divided.\n\n");
}
}
else
{
printf("Collection #%d:\n",CASE);
printf("Can't be divided.\n\n");
}
}
return 0;
}
恩 再补一道同类型的题目
HDU(3732)
Ahui Writes Word
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2214 Accepted Submission(s): 811
of the total is less than or equal to C.
Question: the maximum value Ahui can get.
Note: input words will not be the same.
Each of the next N line are a string and two integer, representing the word, the value(Vi ) and the complexity(Ci ). (0 ≤ Vi , Ci ≤ 10)
5 20
go 5 8
think 3 7
big 7 4
read 2 6
write 3 5
15HintInput data is huge,please use “scanf(“%s”,s)”
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <ctime>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <string>
#define oo 0x13131313
using namespace std;
int N,C;
char buffer[30];
int map[20][22];
int ER[30];
int tot;
int v[3000];
int w[3000];
int F[10001];
void ER1()
{
ER[0]=1;
for(int i=1;i<=20;i++)
{
ER[i]=ER[i-1]*2;
}
}
void input()
{
int a,b;
tot=0;
memset(map,0,sizeof(map));
memset(F,0,sizeof(F));
for(int i=1;i<=N;i++)
{
scanf("%s %d %d",buffer,&a,&b);
map[a][b]++;
}
}
void init()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
}
void solve()
{
for(int i=1;i<=10;i++)
for(int j=0;j<=10;j++)
{
int temp=0;
while(map[i][j]>0)
{
if(map[i][j]>=ER[temp])
{
v[++tot]=ER[temp]*i;
w[tot]=ER[temp]*j;
}
else
{
v[++tot]=map[i][j]*i;
w[tot]=map[i][j]*j;
}
{
map[i][j]=map[i][j]-v[tot]/i;
temp++;
}
}
}
}
void dp()
{
for(int i=1;i<=tot;i++)
for(int j=C;j>=0;j--)
{
if(j-w[i]>=0)
F[j]=max(F[j],F[j-w[i]]+v[i]);
}
}
int main()
{
// init();
ER1();
while(cin>>N>>C)
{
input();
solve();
dp();
printf("%d\n",F[C]);
}
return 0;
}
【二进制拆分多重背包】【HDU1059】【Dividing】的更多相关文章
- poj1014二进制优化多重背包
Dividing Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 53029 Accepted: 13506 Descri ...
- [Bzoj 1192][HNOI2006]鬼谷子的钱袋(二进制优化多重背包)
(人生第一篇bzoj题解有点激动 首先介绍一下题目: 看它题目那么长,其实意思就是给定一个数a,求将其拆分成n个数,通过这n个数可以表示出1~a中所有数的方案中,求最小的n. 您看懂了嘛?不懂咱来举个 ...
- 51nod 1086 背包问题 V2(二进制优化多重背包)
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1086 题解:怎么用二进制优化多重背包,举一个例子就明白了. ...
- POJ - 1276 二进制优化多重背包为01背包
题意:直接说数据,735是目标值,然后3是后面有三种钱币,四张125的,六张五块的和三张350的. 思路:能够轻易的看出这是一个多重背包问题,735是背包的容量,那些钱币是物品,而且有一定的数量,是多 ...
- 2018.09.08 bzoj1531: [POI2005]Bank notes(二进制拆分优化背包)
传送门 显然不能直接写多重背包. 这题可以用二进制拆分/单调队列优化(感觉二进制好写). 所谓二进制优化,就是把1~c[i]拆分成20,21,...2t,c[i]−2t+1+1" role= ...
- dp之多重背包hdu1059
题意:价值为1,2,3,4,5,6. 分别有n[1],n[2],n[3],n[4],n[5],n[6]个.求能否找到满足价值刚好是所有的一半的方案. 思路:简单的多重背包,我建议多重背包都用二进制拆分 ...
- 【二进制优化-多重背包】zznu-oj-2120 : 安详--如何用尽钱币打赏主播获得最大好感度
2120 : 安详 题目描述 spring最近喜欢上了B站新秀主播,身为顿顿吃黄焖鸡的土豪,当然要过去打赏一番,但是spring还是喜欢精打细算,所以在打赏的时候,想要掏出有限的钱,获得主播的最大好感 ...
- poj 1742 Coins(二进制优化多重背包)
传送门 解题思路 多重背包,二进制优化.就是把每个物品拆分成一堆连续的\(2\)的幂加起来的形式,然后把最后剩下的也当成一个元素.直接类似\(0/1\)背包的跑就行了,时间复杂度\(O(nmlogc) ...
- BZOJ 1531 二进制优化多重背包
思路: 讲道理我应该写单调队列优化多重背包的 但是我不会啊 但是我现在! 还不会啊 我就写了个二进制优化的.. 过了 //By SiriusRen #include <cstdio> #i ...
随机推荐
- NPOI兼容 excel2003,2007版本
根据项目需要,需要对excel进行导入导出,所以选择NPOI,优点在这里就不详细介绍了,下面进入正题. public int Import(string path) { IList<Studen ...
- 让资源可以下载a
第一种方式------不存在任何兼容性 <a href='x.zip'>下载</a> 将要链接的资源进行打包即可 第二种方式----存在兼容性,目前只有Chrome 和Fire ...
- HTML中的figure与figcaption标签
本来想分两篇文章来解释说明figure.figcaption的,但是这俩个标签都是定义图文的,所以我们合起来讲解,大家更能容易接受. 大家在写xhtml.html中常常用到一种图片列表,图片+标题或者 ...
- 反射操作辅助类ReflectionUtil
这篇文章的目的是介绍这样一种方式,就是在写一个函数的时候,传递的参数是object类型的,在这个函数里面想访问这个参数对象的某一属性值,我们知道这个属性值的name,但是一般情况下,object对象是 ...
- .NET防止SQL、JS、HTML注入
/// <summary> /// 过滤标记 /// </summary> /// <param name="NoHTML">包括HTML,脚本 ...
- Android使用webService
在android中使用webservice,首先要导入Android webservice支持包 ksoap2-android-assembly-3.3.0-jar-with-dependencies ...
- ios ColorLUT滤镜
通过这种方格图片实现滤镜 代码: "CIFilter+ColorLUT.h" "CIFilter+ColorLUT.m" #import "CIFil ...
- S - stl 的mapⅠ
先来介绍一下stl中的map这个功能 头文件#include<map> map是STL的一个关联容器,它提供一对一的数据处理能力 就像一个人对应一个编号一样 定义 为 map<in ...
- PO VO DAO DTO BO TO概念与区别
O/R Mapping 是 Object Relational Mapping(对象关系映射)的缩写.通俗点讲,就是将对象与关系数据库绑定,用对象来表示关系数据.在O/R Mapping的世界里,有两 ...
- android签名相关
生成apk.keystore: 右键工程:Android tools——>Export Signed Application Package后,相册中截图: 一直下一步下一步,成功后jarsig ...