whu1608 遍历子集dp
来源:互联网 发布:网页三剑客软件下载 编辑:程序博客网 时间:2024/05/02 01:06
题目大意:给你n个数和s,问最多将n分为多少组,使每组通过加减操作能得到s的组数最多,输出组数
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long lint; int n, s, T, a[20]; int sum[1 << 20], f[1 << 20], g[1 << 20]; int main() { //freopen( "A.in", "r", stdin ); scanf( "%d", &T ); while ( T -- ) { scanf( "%d%d", &n, &s ); for ( int i = 0; i < n; i ++ ) { scanf( "%d", &a[i] ); } for ( int i = 0; i < (1 << n); i ++ ) { //遍历所有子集 sum[i] = 0; for ( int j = 0; j < n; j ++ ) if ( (i >> j) & 1 ) { sum[i] += a[j]; } } for ( int i = 0; i < (1 << n); i ++ ) {<span style="white-space:pre"> </span>//查看子集的子集是否有满足条件 f[i] = ( sum[i] == s ); for ( int j = (i - 1) & i; j; j = (j - 1) & i ) { f[i] |= ( sum[j] + s == sum[i - j] || sum[j] - s == sum[i - j] ); } } g[0] = 0; int ans = 0; for ( int mask = 0; mask < (1 << n); mask ++ ) { //维护取最大值 g[mask] = f[mask]; for ( int sub = mask & (mask - 1); sub; sub = ( sub - 1 ) & mask ) { g[mask] = max( g[mask], g[sub] + g[mask - sub] ); } ans = max( ans, g[mask] ); } cout <<ans<<endl; } return 0; }
0 0
- whu1608 遍历子集dp
- whu1608 遍历子集状压写法
- whu1608 Calculation
- 遍历所有子集
- 递归遍历数组子集
- bzoj4416 阶乘字符串 子集dp
- hdu-5823-color II-状压DP-枚举子集的子集
- delphi treeview 遍历所有子集节点
- 最大独立子集模板!!!(树形dp)
- poj 1192 最优联通子集 简单dp
- (树形DP) 最优连通子集(POJ1192)
- POJ 1192 -最优连通子集 树形DP
- POJ1192最优连通子集(树状dp)
- poj 1192 最优连通子集 树状dp
- poj 1192 最优连通子集 树状dp
- poj 2836 子集 状态压缩dp
- DP——划分子集和问题
- bzoj 2560: 串珠子 子集dp
- “No Module Named Tkinter”解决
- 参考资料
- 写日志封装类
- java线程基本概念及实现
- Input.GetAxisRaw 与Input.GetAxis
- whu1608 遍历子集dp
- 知道一个窗口程序的 HWND ,如何等待它完全关闭退出
- Android性能优化(一)内存泄露优化(静态变量、单例模式、属性动画)
- 百度地图点聚合MarkerClusterer,性能优化
- php 杂项函数
- 剑指offer36:数组中的逆序对
- Shell-条件判断
- c++中vector的用法详解
- 关于MBR病毒的一些调研及分析工作