WOJ 1608 Calculation
来源:互联网 发布:在线抓阄软件 编辑:程序博客网 时间:2024/06/05 00:10
题目链接:http://acm.whu.edu.cn/land/problem/detail?problem_id=1608
题意:将n个数划分为若干个部分,然后每一部分里面的数进行+/-操作,如果一个部分里面的数可以凑成s,那么就计1,问最多可以凑成多少个s。
比如1 2 3 4 5 -> (1+4) (2+3) (5) 1 2 3 8 8 -> (8-3) (8-1-2)
思路:状态压缩Dp,用二进制表状态先预处理状态为s时的和,然后再求每个状态能否构成s,最后再计算每个状态最多能构成多少个s,后两个可以借助位运算来枚举子集。
#include <cstdio>#include <cmath>#include <cstring>#include <string>#include <cstdlib>#include <iostream>#include <algorithm>#include <stack>#include <map>#include <set>#include <vector>#include <sstream>#include <queue>#include <utility>using namespace std;#define rep(i,j,k) for (int i=j;i<=k;i++)#define Rrep(i,j,k) for (int i=j;i>=k;i--)#define Clean(x,y) memset(x,y,sizeof(x))#define LL long long#define ULL unsigned long long#define inf 0x7fffffff#define mod %100000007int const maxn = 1<<14;int T;int n,s;int a[15];int sum[maxn];int ans[maxn];int f[maxn];int main(){ cin>>T; while(T--) { Clean(f,0); Clean(sum,0); Clean(ans,0); scanf("%d %d",&n,&s); rep(i,1,n) scanf("%d",&a[i]); int uplim = 1<<n; for( int i = 1; i <= uplim - 1; i++ ) //先处理当前状态的和 for( int j = 0; j < n; j++ ) if ( i & 1<<(j) ) sum[i] += a[j+1]; for( int i = 1; i <= uplim-1; i++ ) { ans[i] = ( sum[i] == s ); if ( !ans[i] ) //当前状态的数是否可以凑成s { for( int j = i & ( i - 1 ); j; j = i & ( j - 1 ) ) { ans[i] = ans[i] | ( ( sum[j] == s + sum[i & ~j] ) || ( sum[i & ~j] == s + sum[i] ) ); } } f[i] = ans[i]; //当前状态的这些数最多可以凑成几个s for( int j = i & ( i - 1 ); j; j = i & ( j - 1 ) ) { f[i] = max( f[i] , f[j] + f[i & ~j] ); } } printf("%d\n",f[uplim-1]); } return 0;}
0 0
- WOJ 1608 Calculation
- Woj 1608 - Calculation 状压dp
- WOJ 1608 Calculation(状态压缩)
- WOJ 1608 Calculation (暴力搜索/动态规划)
- WOJ 1608 状压dp
- WOJ
- woj
- whu 1608 Calculation (状压)
- Problem 1608 - Calculation
- Calculation
- Problem 1608 - Calculation 【状压dp】
- WOJ 1020
- WOJ 1014
- WOJ 1055
- WOJ-1402
- WOJ--1314
- WOJ-1315
- WOJ-1316
- iOS中assign,copy,retain之间的区别以及weak和strong的区别
- 领域驱动设计之领域模型
- Jquery学习之旅之CSS类的设置和移除
- 关于用栈解决ACM括号配对问题
- 欢迎使用CSDN-markdown编辑器
- WOJ 1608 Calculation
- 使用python实现可重入的公平读写锁
- git代码库回滚
- Linux下命令整理
- [问题记录.VisualStudio]TFS项目映射问题解决
- UIView常用的一些方法小记之setNeedsDisplay和setNeedsLayout
- 谷歌Gson工具类
- andorid中APN与SPN相关的设置相关
- Maven 命令