题目:https://agc020.contest.atcoder.jp/tasks/agc020_c

回忆下一题,是零一背包,主要的做法就是凑出最接近sum/2的价值,然后发现现在的背包的容量是2000*2000,物品数量是2000,那么如果你用正常的

数组背包的做法的话,8*10^9的复杂度是会超时的,代码如下:

int n;
scanf("%d",&n);
ll sum = ;
rep(i,,n) scanf("%lld",&a[i]),sum+=a[i];
dp[] = ;
rep(i,,n) repd(j,(sum+)/,a[i]) dp[j] = max(dp[j],dp[j-a[i]]);
repd(i,sum/,) if(dp[i]) return printf("%lld",sum-i),;
return ;

我们会发现,每个背包的状态要么是零,要么是1,那么我们就可以用bitset来实现速度上的优化:

8*10^9/64,那么这样的话,是符合时间限制的,代码如下:

bitset<maxn> bt;
int main()
{
int n,a,sum = ;
scanf("%d",&n);
bt[] = ;
rep(i,,n){
scanf("%d",&a);
bt |= bt<<a;
sum += a;
}
rep(j,(sum+)/,sum+) if(bt[j]) return printf("%d",j),;
return ;
}

那么为什么可以用位运算的|(或)呢,因为你看正常的数组做法,

dp[j] = max(dp[j],dp[j-a[i]]);

dpj是从dpj-ai转移过来的,所以减去ai就可以相当于位运算的左移

最新文章

  1. dedecms qq咨询平均分配
  2. 610K图纸打印新版增值税发票不完整的调整方法
  3. 兼容ie7、8、9、10、FF、Chrome的遮罩显示
  4. PHP加密解密字符串
  5. HTTP长连接200万尝试及调优
  6. [GIF] The Phase Property in GIF Loop Coder
  7. poj 2431 Expedition
  8. 【Jquery EasyUI + Servlet】DataGrid,url请求带中文出现乱码的解决方案
  9. RSA算法python实现
  10. GitHub上最受欢迎的Android开源项目TOP20
  11. js中的AMD规范
  12. ISP和IAP
  13. 介绍下Python的两个标准库 os 和 sys
  14. 日程管理 FullCalendar
  15. thinkphp调试技巧
  16. C# 只开启一个程序,如果第二次打开则自动将第一个程序显示到桌面
  17. TopCoder FlowerGarden【拓扑排序】
  18. 【Python】socket编程-1
  19. 为什么使用Reazor
  20. HEOI2018翻盘记

热门文章

  1. HDU2161 Primes
  2. 基本SQL查询
  3. windows无法开机解决方法
  4. C# 低耦合 高内聚
  5. 洛谷——P2440 木材加工
  6. Spring自带字符编码过滤器
  7. 在MVC中使用泛型仓储模式和依赖注入实现增删查改
  8. 【Java集合源代码剖析】LinkedList源代码剖析
  9. nyoj--74--小学生算术(水)
  10. Java-MyBatis-杂项: MyBatis 中 in 的用法2