$ Coins $



$ solution: $

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

** $ bitset $ 优化:** 这个是我最先想到的,因为这道题只牵扯到了能不能买,就是一个“是”和“否”的问题,也就是说这个背包并没有什么权值(只有“可以”和“不可以”)然后就是单纯的状态转移。而这不是我们的二进制最擅长的东西吗?(我们利用某一个硬币的面额进行更新时,直接用二进制的左右移和或运算即可)不过这一题的范围有一点大,所以我们选择 $ bitset $

二进制拆分优化: 这个还是得学的,不过他确实很奇妙,就像我们可以用2的一些乘方来表达出所有的数一样,我们可以将这个思想带到多重背包里来。但是我们的二进制能表达出所有的数,而我并不一定需要它表示出那么多的数啊(比如 $ 20,21\dots 27,28 $ 可以表示出256以内所有的数,但我只要23以内怎么办? )!而解决这个问题就是二进制拆分最难思考的地方了。

二进制拆分的重点,博主决定举个例子,能理解这个例子很多问题就能迎刃而解了:我现在有一个集合 $ {20,21\dots 27,28 } $ 我可以用它表示出256以内的任何数,而如果我只想要它表示出189以内的数,那我只需要将集合里最大的数改为 $ 189-2^7 $ 即可也就是 $ {20,21\dots 27,189-27 } $ 可以表示出189以内的任何数。这里的证明留给大家,因为博主自己学习的时候发现如果单纯看证明理解似乎不如手算去感性理解。然后说明一下这个方法其实有一个地方需要注意(也是迷惑人最多的地方):博主为什么选择了从 $ 2^0\dots 2^7 $ 为什么又选了189这个数字,其实是因为必须满足向 $ 2^p $ 这个集合中最大的数一定是要比189这样的常数 $ k $ 小的最大的2的乘方!



$ code: $

#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<bitset> #define ll long long
#define db double
#define inf 0x7fffffff
#define rg register int using namespace std; bitset<100005> f; int n,m,ans;
int a[105]; inline int qr(){
register char ch; register bool sign=0; rg res=0;
while(!isdigit(ch=getchar())) if(ch=='-')sign=1;
while(isdigit(ch)) res=res*10+(ch^48),ch=getchar();
return sign?-res:res;
} int main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
while((n=qr())&&(m=qr())){
f&=1; f[0]=1; ans=0;
for(rg i=1;i<=n;++i) a[i]=qr();
for(rg i=1;i<=n;++i){ rg x=qr();
for(rg j=1;j<=x;x-=j,j<<=1)
if(a[i]*j<=m)f|=f<<(a[i]*j);
if(x*a[i]<=m)f|=f<<(x*a[i]);
}for(rg i=1;i<=m;++i) if(f[i])++ans;
printf("%d\n",ans);
}
return 0;
}

poj 1742 Coins(二进制拆分+bitset优化多重背包)的更多相关文章

  1. 【题解】Coins(二进制拆分+bitset)

    [题解]Coins(二进制拆分+bitset) [vj] 俗话说得好,bitset大法吼啊 这道题要不是他多组数据卡死了我复杂度算出来等于九千多万的选手我还不会想这种好办法233 考虑转移的实质是怎样 ...

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

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

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

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

  4. hdu 2844 poj 1742 Coins

    hdu 2844 poj 1742 Coins 题目相同,但是时限不同,原本上面的多重背包我初始化为0,f[0] = 1;用位或进行优化,f[i]=1表示可以兑成i,0表示不能. 在poj上运行时间正 ...

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

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

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

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

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

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

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

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

  9. [tyvj-1194]划分大理石 二进制优化多重背包

    突然发现这个自己还不会... 其实也不难,就和快速幂感觉很像,把物品数量二进制拆分一下,01背包即可 我是咸鱼 #include <cstdio> #include <cstring ...

随机推荐

  1. iOS第三方地图-高德地图(导航sdk路径规划)

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  2. P1122 最大子树和 (树形DP)

    题目描述 小明对数学饱有兴趣,并且是个勤奋好学的学生,总是在课后留在教室向老师请教一些问题.一天他早晨骑车去上课,路上见到一个老伯正在修剪花花草草,顿时想到了一个有关修剪花卉的问题.于是当日课后,小明 ...

  3. 648. Replace Words

    Problem statement In English, we have a concept called root, which can be followed by some other wor ...

  4. Spoj-BLMIRINA Archery Training

    Mirana is an archer with superpower. Every arrow she shoots will get stronger the further it travels ...

  5. python和scrapy的安装【转:https://my.oschina.net/xtfjt1988/blog/364577】

    抓取网站的代码实现很多,如果考虑到抓取下载大量内容scrapy框架无疑是一个很好的工具.Scrapy = Search+Pyton.下面简单列出安装过程.PS:一定要按照Python的版本下载,要不然 ...

  6. GT考试 BZOJ 1009

    GT考试 [问题描述] 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字. 他的不吉利数学A1A2...Am(0< ...

  7. 安装破解版的webstorne

    参考以下链接:https://www.cnblogs.com/cui-cui/p/8507435.html

  8. Perl、PHP、Python、Java和Ruby的比较

    提问 ◆ Perl.Python.Ruby和PHP各自有何特点? ◆ 为什么动态语言多作为轻量级的解决方案? ◆ LAMP为什么受欢迎? ◆ Ruby on Rails为什么会流行? ◆ 编程语言的发 ...

  9. JavaScript插件

    Spket ide Spket ide是强大的工具包为了JavaScript和XML的开发,这个强大的编辑器对JavaScript, XUL/XBLand Yahoo! Widget的开发都有全面的支 ...

  10. NOIP临考经验(转)

    [COGS]NOIP临考经验 1.  提前15分钟入场,此时静坐调整心态,适当的深呼吸 2.  打开编辑器并调整为自己喜欢的界面 3.  熟悉文件目录,写好准确无误的代码模板 4.  压缩包或许还不能 ...