/*问你能不能将给出的资源平分成两半,那么我们就以一半为背包,运行多重背包模版
但是注意了,由于个数过大,直接运行会超时,所以要用二进制拆分每种的个数*/
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int w[],vr[],dp[];
int a[],v[];
int numw;
void cf(int n,int ok)
{
int i,j,sum,e;
e=sum=;
while(sum<=n)
{
vr[numw]=v[ok];
w[numw++]=e;
e*=;
sum+=e;
}
if(n-(sum-e)>)
{
w[numw]=n-(sum-e);
vr[numw]=v[ok];
numw++;
}
}
int main()
{
int i,j,n,m,k;
int n1,n2,n3,n4,n5,n6;
int cas=;
while(scanf("%d%d%d%d%d%d",&n1,&n2,&n3,&n4,&n5,&n6)!=EOF)
{
if(n1== && n2== && n3== && n4== && n5== && n6==) break;
int num=;
if(n1!=) { a[num]=n1; v[num++]=;}
if(n2!=) { a[num]=n2; v[num++]=;}
if(n3!=) { a[num]=n3; v[num++]=;}
if(n4!=) { a[num]=n4; v[num++]=;}
if(n5!=) { a[num]=n5; v[num++]=;}
if(n6!=) { a[num]=n6; v[num++]=;}
int sum=;
//printf("%d\n",num);
for(i=;i<num;i++)
{
sum=sum+a[i]*v[i];
}
if(sum==) break;
if(sum%)
{
printf("Collection #%d:\n",++cas);
printf("Can't be divided.\n\n");
continue;
}
numw=;
for(i=;i<=sum/;i++)
dp[i]=;
for(i=;i<num;i++)
{
cf(a[i],i);
}
for(i=;i<numw;i++)
for(j=sum/;j>=w[i]*vr[i];j--)
dp[j]=max(dp[j],dp[j-w[i]*vr[i]]+w[i]*vr[i]);
printf("Collection #%d:\n",++cas);
if(dp[sum/]==sum-dp[sum/]) printf("Can be divided.\n\n");
else printf("Can't be divided.\n\n");
}
return ;
}

HDU1059 二进制拆分优化多重背包的更多相关文章

  1. poj 1742 Coins(二进制拆分+bitset优化多重背包)

    \(Coins\) \(solution:\) 这道题很短,开门见山,很明显的告诉了读者这是一道多重背包.但是这道题的数据范围很不友好,它不允许我们直接将这一题当做01背包去做.于是我们得想一想优化. ...

  2. [Bzoj 1192][HNOI2006]鬼谷子的钱袋(二进制优化多重背包)

    (人生第一篇bzoj题解有点激动 首先介绍一下题目: 看它题目那么长,其实意思就是给定一个数a,求将其拆分成n个数,通过这n个数可以表示出1~a中所有数的方案中,求最小的n. 您看懂了嘛?不懂咱来举个 ...

  3. poj1014二进制优化多重背包

    Dividing Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 53029   Accepted: 13506 Descri ...

  4. BZOJ 1531 二进制优化多重背包

    思路: 讲道理我应该写单调队列优化多重背包的 但是我不会啊 但是我现在! 还不会啊 我就写了个二进制优化的.. 过了 //By SiriusRen #include <cstdio> #i ...

  5. 51nod 1086 背包问题 V2(二进制优化多重背包)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1086 题解:怎么用二进制优化多重背包,举一个例子就明白了. ...

  6. POJ - 1276 二进制优化多重背包为01背包

    题意:直接说数据,735是目标值,然后3是后面有三种钱币,四张125的,六张五块的和三张350的. 思路:能够轻易的看出这是一个多重背包问题,735是背包的容量,那些钱币是物品,而且有一定的数量,是多 ...

  7. 2018.09.08 bzoj1531: [POI2005]Bank notes(二进制拆分优化背包)

    传送门 显然不能直接写多重背包. 这题可以用二进制拆分/单调队列优化(感觉二进制好写). 所谓二进制优化,就是把1~c[i]拆分成20,21,...2t,c[i]−2t+1+1" role= ...

  8. 【二进制优化-多重背包】zznu-oj-2120 : 安详--如何用尽钱币打赏主播获得最大好感度

    2120 : 安详 题目描述 spring最近喜欢上了B站新秀主播,身为顿顿吃黄焖鸡的土豪,当然要过去打赏一番,但是spring还是喜欢精打细算,所以在打赏的时候,想要掏出有限的钱,获得主播的最大好感 ...

  9. poj 1742 Coins(二进制优化多重背包)

    传送门 解题思路 多重背包,二进制优化.就是把每个物品拆分成一堆连续的\(2\)的幂加起来的形式,然后把最后剩下的也当成一个元素.直接类似\(0/1\)背包的跑就行了,时间复杂度\(O(nmlogc) ...

随机推荐

  1. HttpPost导包遇到的问题

    直接在当前项目 build.gradle文件修改如下 android { useLibrary 'org.apache.http.legacy' compileSdkVersion 24 buildT ...

  2. 剑指offer练习

    1.题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数.  public c ...

  3. 深入浅出Docker(三):Docker开源之路

    背景 Docker从一开始的概念阶段就致力于使用开源驱动的方式来发展,它的成功缘于国外成熟的开源文化氛围,以及可借鉴的社区运营经验.通过本文详细的介绍,让大家可以全面了解一个项目亦或者一项技术是如何通 ...

  4. LeetCode——Search for a Range

    Description: Given a sorted array of integers, find the starting and ending position of a given targ ...

  5. [Fine Uploader] 用Fine Uploader+ASP.NET MVC实现ajax文件上传[代码示例]

    Fine Uploader(http://fineuploader.com/)是一个实现 ajax 上传文件的 Javascript 组件   This project attempts to ach ...

  6. 解决pip install 安装慢问题

    使用豆瓣源 比如安装pyspark pip install -i https://pypi.douban.com/simple/ pyspark 速度就比用pip install快N倍 关注公众号:

  7. 【转载】排查Linux机器是否已经被入侵

          背景信息:以下情况是在CentOS 6.9的系统中查看的,其它Linux发行版类似 1.入侵者可能会删除机器的日志信息,可以查看日志信息是否还存在或者是否被清空,相关命令示例: [root ...

  8. 洛谷P2444 病毒【AC自动机】

    题目描述 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码段,试问,是否 ...

  9. saltstack相关

    通过saltstack实现根据不同业务特性进行配置集中化管理,分发文件,采集服务器数据,操作系统基础及软件包管理等第一层为web交互层,采用django+mysql+bootstarp实现,服务端采用 ...

  10. Ubuntu操作异常汇总

    1.使用Ubuntu的apt-get安装软件时出现以下错误: Reading package lists... Done Building dependency tree... Done Packag ...