SPOJ SUBSUMS Subset Sums 折半枚举
来源:互联网 发布:ubuntu kylin qq 编辑:程序博客网 时间:2024/05/22 15:13
题目:
http://www.spoj.com/problems/SUBSUMS/en/
题意:
整数集S有n个元素,问S的子集和落在区间[A,B]中的个数
思路:
直接枚举肯定会T的,可以折半枚举,分成两个整数集,分别求出两个整数集的所有子集和,设子集和的集合分别为
#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N = 50, M = 1<<18;ll arr[M+10], brr[M+10];//二进制枚举子集和,用dfs枚举也可以int work(ll *arr, int *tm, int m, int len){ int k = 0; for(int i = 0; i < (1<<m); i++) { for(int j = 0; j < m; j++) if(i & (1<<j)) arr[k] += tm[len-1-j]; k++; } return k;}int main(){ int n; ll a, b; int tm[N]; scanf("%d%lld%lld", &n, &a, &b); for(int i = 0; i < n; i++) scanf("%d", &tm[i]); int len = n/2; int k1 = work(arr, tm, len, len); int k2 = work(brr, tm, n-len, n); sort(arr, arr + k1); sort(brr, brr + k2); ll res = 0; for(int i = 0; i < k1; i++) { res += upper_bound(brr, brr + k2, b-arr[i]) - lower_bound(brr, brr + k2, a-arr[i]); } printf("%lld\n", res); return 0;}
0 0
- SPOJ SUBSUMS Subset Sums 折半枚举
- SPOJ SUBSUMS
- POJ3977 Subset 折半枚举
- poj3977 Subset 折半枚举
- POJ3977-Subset 折半枚举
- 【洛谷】1466 集合 Subset Sums 折半搜索
- poj3977 Subset(折半枚举)
- poj 3977 Subset 折半枚举
- POJ - 3977 Subset(折半枚举)
- POJ 3977 Subset (折半枚举)
- POJ 3977 Subset (折半枚举+二分)
- Poj 3977 Subset 折半枚举 超大背包
- POJ 3977 Subset (简单折半枚举)
- Subset Sums
- Subset Sums
- Subset Sums
- Subset Sums
- poj 3977 Subset(折半枚举+状压dp)
- Android中第三方SDK集成之百度地图集成(入门篇)
- Mysql分区的使用
- 快速排序
- Qt登录对话框
- Mac下启动tomcat
- SPOJ SUBSUMS Subset Sums 折半枚举
- 学习SSH 增删改查
- 顺序统计量
- Linux(CentOS6.5)下编译安装Nginx官方最新稳定版(nginx-1.10.0)
- Eclipse进行可视化的GUI开发3大GUI插件
- 用户登录记住密码(SharedPreferences的使用)
- HDU 1879 继续畅通工程
- VTK基本概念之灯光
- lua的sort排序