WOJ 1608 Calculation(状态压缩)
2016-04-09 21:38
393 查看
题意:给出n个数(n<=14),现在可以将这n个数任意分组,每组的每个数可以在前面加上一个正号或者符号,问最多有多少组的和等于s。
思路:状态压缩,每个状态表示当前的状态可以分成多少组含有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; }
相关文章推荐
- UVALive 6625_状态压缩
- 2014辽宁省赛 Picking Cabbage 状压dp
- 状态压缩DP joboj1430 shortest path 和 codeforces Problem 21 D Traveling Graph
- 状态压缩DP poj—1185 炮兵阵地 和 cf 111 Problem C Petya and Spiders (经典)
- 动态规划状态压缩题解
- LA 6450 Social Advertising
- Sicily 1148 过河
- POJ2411(状态压缩DP)
- HDU 5135 Little Zu Chongzhi's Triangles(状态压缩)
- HDU 3681 Prison Break(BFS+二分+状态压缩DP)
- UVa 12317 (状态压缩DP)
- HDU 3362 (状态压缩DP)
- poj 3254 Corn Fields
- POJ 1185 炮兵阵地 经典状态压缩DP
- POJ 3311 Hie with the Pie 状态压缩DP
- HDU 3001 Travelling 状态压缩dp+3进制
- zoj 3471状态压缩DP
- POJ 2411Mondriaan's Dream
- HDU 4628 状态压缩
- HDU 3006