WOJ 1608 Calculation(状态压缩)
来源:互联网 发布:淘宝怎么显示在线人数 编辑:程序博客网 时间:2024/06/06 01:24
题意:给出n个数(n<=14),现在可以将这n个数任意分组,每组的每个数可以在前面加上一个正号或者符号,问最多有多少组的和等于s。
思路:状态压缩,每个状态表示当前的状态可以分成多少组含有s的组,然后状态转移即可。
#include<bits/stdc++.h>#define eps 1e-6#define LL long long#define pii pair<int, int>#define pb push_back#define mp make_pair//#pragma comment(linker, "/STACK:1024000000,1024000000")using namespace std;const int MAXN = 1<<15;//const int INF = 0x3f3f3f3f;int n, s, a[16], dp[MAXN], sumv[MAXN];int main(){ freopen("input.txt", "r", stdin);int T;scanf("%d", &T);while (T--) {scanf("%d%d", &n, &s);memset(dp, 0, sizeof(dp));memset(sumv, 0, sizeof(sumv));for (int i = 0; i < n; i++)scanf("%d", &a[i]);for (int i = 0; i < (1<<n); i++) for (int j = 0; j < n; j++) if ((1<<j)&i) sumv[i] += a[j];for (int i = 0; i < (1<<n); i++) {dp[i] = (sumv[i] == s);for (int j = i; j; j = (j-1)&i) dp[i] |= (sumv[i^j]-sumv[j] == s);}dp[0] = 0;for (int i = 0; i < (1<<n); i++) for (int j = i; j; j = (j-1)&i) dp[i] = max(dp[i], dp[j]+dp[i^j]);printf("%d\n", dp[(1<<n)-1]);} return 0;}
1 0
- WOJ 1608 Calculation(状态压缩)
- WOJ 1608 Calculation
- Woj 1608 - Calculation 状压dp
- WOJ 1608 Calculation (暴力搜索/动态规划)
- hdu1885(状态压缩)
- poj3254(状态压缩)
- hdu1565(状态压缩)
- hdu4856(状态压缩)
- poj1185(状态压缩)
- 状态压缩(初识)
- WOJ 1608 状压dp
- WOJ
- woj
- HIHO #1044 : 状态压缩·一(状态压缩dp)
- 状态压缩(1)--hdu5094(状态压缩+bfs)(能力题)
- hdu1565(状态压缩dp)
- (状态压缩) Travelling (HDU3001)
- uva10160(dfs+状态压缩)
- Apktool的使用
- Eclipse配置Struts2问题:ClassNotFoundException: org...dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
- x86上的那些UNIX——System V篇(Solaris、SCO)
- 第五届华中区程序设计邀请赛暨武汉大学第十四届校赛 网络预选赛
- 【设计模式】——五问单例模式
- WOJ 1608 Calculation(状态压缩)
- 中缀表达式转后缀并计算值
- 怎样增强MyEclipse的代码自动提示功能
- 重载Cocos2D生存期的方法
- Unicode字符集和多字节字符集关系
- 类似于约瑟夫环的杀人游戏
- FFmpeg简介
- Java8 Stream类学习笔记
- LeetCode *** 219. Contains Duplicate II