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

【vj】

俗话说得好,bitset大法吼啊

这道题要不是他多组数据卡死了我复杂度算出来等于九千多万的选手我还不会想这种好办法233

考虑转移的实质是怎样的,就是对于一个\(dp\)数组表,平移\(val_i \times num_i'\)位然后异或起来,这样就直接bitset开就好了。

背包问题的转移就不说了,优化就是利用二进制来优化,方法就是,我们可以知道所有数都是二进制表示出来的,根据加法交换律以及背包转移的方法,我们从小往大枚举\(2^x\le num_i\),然后把bitset平移\(2^x\)位后异或起来就好了。

但是有个天大的问题就是怎么保证我们的方案合法,也就是说保证我们的方案中不存在硬币用得过多。

实际上直接在循环的时候控制一下就好了,出来的方案就会\(\le num_i\)并且每个组合都会考虑到。

//@winlere
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<bitset> using namespace std; typedef long long ll;
const int maxm=1e5+5;
const int maxn=1e2+5;
int val[maxn],num[maxn];
bitset < maxm > dp; int n,m;
inline int qr(){
register int ret=0,f=0;
register char c=getchar();
while(c<48||c>57)f|=c==45,c=getchar();
while(c>=48&&c<=57) ret=ret*10+c-48,c=getchar();
return f?-ret:ret;
} int main(){
dp[0]=1;int ans=0;
while(scanf("%d%d",&n,&m),n||m){
for(register int t=1;t<=n;++t) val[t]=qr();
for(register int t=1;t<=n;++t) num[t]=qr();
dp&=1;
for(register int t=1;t<=n;++t){
for(register int i=1;i<=num[t];i<<=1)
if(1ll*i*val[t]<=m) dp|=dp<<(i*val[t]),num[t]-=i;
else num[t]-=i;
if(1ll*num[t]*val[t]<=m) dp|=dp<<(num[t]*val[t]);
}
for(register int t=1;t<=m;++t)
if(dp[t]) ++ans;
printf("%d\n",ans);
ans=0;
}
return 0;
}

最新文章

  1. iOS开发系列--Swift 3.0
  2. 最新hadoop+hbase+spark+zookeeper环境安装(vmmare下)
  3. Jquery禁止/恢复按钮与文本框代码
  4. CRM 2016 js 奇怪现象
  5. 一个最简单的登录页面测试case
  6. BOM表生成
  7. 【bzoj1004】[HNOI2008]Cards
  8. Listview异步加载之优化篇
  9. Android自定义radiobutton(文字靠左,选框靠右)
  10. 通过预编译头文件来提高C++ Builder的编译速度
  11. 虚拟机配置静态IP地址
  12. UNIX环境高级编程——system V消息队列
  13. 全球第一免费开源ERP Odoo工业互联网生产制造功能模块术语解析
  14. 如何编写高效的jQuery代码(转载)
  15. [android] 采用pull解析xml文件
  16. SQL Server重置INDETITY的开始值
  17. 关于c#的知识博客
  18. CentOS7系列--1.4CentOS7服务
  19. c#调用c++dll(c++界面在c#显示)____制作dll
  20. iOS开发CAAnimation类动画, CATransition动画

热门文章

  1. Tallest Cow
  2. Java编程经验汇总
  3. 聊聊、Zookeeper Linux 单服务
  4. 聊聊、Zookeeper 客户端 ZkClient
  5. Mac outlook设置自动回复
  6. CI框架基础知识
  7. hdu1003(C++)解法1
  8. 脚本命令加载外部配置文件夹conf
  9. script脚本中写不写$(document).ready(function() {});的差别
  10. 模拟利器Mockito