HDU1059 二进制拆分优化多重背包
/*问你能不能将给出的资源平分成两半,那么我们就以一半为背包,运行多重背包模版
但是注意了,由于个数过大,直接运行会超时,所以要用二进制拆分每种的个数*/
#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 二进制拆分优化多重背包的更多相关文章
- poj 1742 Coins(二进制拆分+bitset优化多重背包)
\(Coins\) \(solution:\) 这道题很短,开门见山,很明显的告诉了读者这是一道多重背包.但是这道题的数据范围很不友好,它不允许我们直接将这一题当做01背包去做.于是我们得想一想优化. ...
- [Bzoj 1192][HNOI2006]鬼谷子的钱袋(二进制优化多重背包)
(人生第一篇bzoj题解有点激动 首先介绍一下题目: 看它题目那么长,其实意思就是给定一个数a,求将其拆分成n个数,通过这n个数可以表示出1~a中所有数的方案中,求最小的n. 您看懂了嘛?不懂咱来举个 ...
- poj1014二进制优化多重背包
Dividing Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 53029 Accepted: 13506 Descri ...
- BZOJ 1531 二进制优化多重背包
思路: 讲道理我应该写单调队列优化多重背包的 但是我不会啊 但是我现在! 还不会啊 我就写了个二进制优化的.. 过了 //By SiriusRen #include <cstdio> #i ...
- 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= ...
- 【二进制优化-多重背包】zznu-oj-2120 : 安详--如何用尽钱币打赏主播获得最大好感度
2120 : 安详 题目描述 spring最近喜欢上了B站新秀主播,身为顿顿吃黄焖鸡的土豪,当然要过去打赏一番,但是spring还是喜欢精打细算,所以在打赏的时候,想要掏出有限的钱,获得主播的最大好感 ...
- poj 1742 Coins(二进制优化多重背包)
传送门 解题思路 多重背包,二进制优化.就是把每个物品拆分成一堆连续的\(2\)的幂加起来的形式,然后把最后剩下的也当成一个元素.直接类似\(0/1\)背包的跑就行了,时间复杂度\(O(nmlogc) ...
随机推荐
- Android英文文档翻译系列(2)——HandlerThread
public class HandlerThread extends Thread Class Overview Handy class for starting a new threa ...
- LeetCode——Contains Duplicate II
Description: Given an array of integers and an integer k, find out whether there there are two disti ...
- 关于移动端rem 布局的一些总结
1.rem是什么? rem(font size of the root element)是指相对于根元素的字体大小的单位 2.为什么web app要使用rem? 实现强大的屏幕适配布局(淘宝,腾讯,网 ...
- js表单的focus()与blur()方法
前段时间在多文本输入textarea中遇到点小问题,textarea在HTML是没有value属性的,但在js里的可以获取其value值. textarea禁止拉伸resize:none; (为了兼容 ...
- 【BZOJ1594】[Usaco2008 Jan]猜数游戏 二分答案+并查集
[BZOJ1594][Usaco2008 Jan]猜数游戏 Description 为了提高自己低得可怜的智商,奶牛们设计了一个新的猜数游戏,来锻炼她们的逻辑推理能力. 游戏开始前,一头指定的奶牛会在 ...
- 微信小程序 --- 事件绑定
事件类别: tap:点击事件: longtap:长按事件: touchstart:触摸开始: touchend:触摸结束: touchcansce:取消触摸: 事件绑定: bind绑定: catch绑 ...
- Thinkphp自定义工具类的使用!
在使用Thinkphp做开发的时候,很多时候会用到一些自己写的类,为了方便管理,可以把这些类,单独放到一个文件里. 这就是自定义工具类: 首先在 Application 目录下新建 Component ...
- AVG
AVG([ DISTINCT | ALL ] expr) [ OVER(analytic_clause) ] SELECT MANAGER_ID, LAST_NAME, ...
- 静态绑定 self 和 static的区别
后期静态绑定 自 PHP 5.3.0 起,PHP 增加了一个叫做后期静态绑定的功能,用于在继承范围内引用静态调用的类. 准确说,后期静态绑定工作原理是存储了在上一个“非转发调用”(non-forwar ...
- c#字符串切割split使用方法
string strtest = "asdfg12wertgv1287654" "}, StringSplitOptions.RemoveEmptyEntries); 结 ...