Woj 1608 - Calculation 状压dp
2016-05-06 12:34
369 查看
思路来自于武大的一个大神 并不是我的。。。
题目链接:http://acm.whu.edu.cn/land/problem/detail?problem_id=1608&contest_id=16
题目大意:给你n个数,让你找它的子集,子集中的数能通过+或-组成s,问这样的子集最多有多少个,任意两个子集不能相交
题目解析:这道题关键是如何枚举子集以及如何判断每个子集能否组成值s,和如何递推
枚举子集其实不难:
这样就能枚举所有子集
要判断子集能否组成s,就要枚举子集的子集
在这里j就是i的子集,因为j枚举了所有比i小的数,且和i做了位与运算,能保证j肯定是i的子集。
如果懂了上面,递推就很简单了
我们知道一个集合j的任意子集s的最优解
只要枚举j的子集,判断哪两个子集相加最大就是集合j的最优解
代码:
题目链接:http://acm.whu.edu.cn/land/problem/detail?problem_id=1608&contest_id=16
题目大意:给你n个数,让你找它的子集,子集中的数能通过+或-组成s,问这样的子集最多有多少个,任意两个子集不能相交
题目解析:这道题关键是如何枚举子集以及如何判断每个子集能否组成值s,和如何递推
枚举子集其实不难:
for(int i=0; i<=(1<<n)-1; i++)
这样就能枚举所有子集
要判断子集能否组成s,就要枚举子集的子集
for(int i=0; i<= ( 1<<n ) - 1; i++) { for(int j=(i-1)&i; j; j=(j-1)&i) { } }
在这里j就是i的子集,因为j枚举了所有比i小的数,且和i做了位与运算,能保证j肯定是i的子集。
如果懂了上面,递推就很简单了
我们知道一个集合j的任意子集s的最优解
只要枚举j的子集,判断哪两个子集相加最大就是集合j的最优解
代码:
#include <iostream> #include <cstring> #include <cstdio> #include <cstdlib> #include <cmath> #include <string> #include <vector> #include <list> #include <map> #include <queue> #include <stack> #include <algorithm> #include <numeric> #include <functional> #define RI(N) scanf("%d",&(N)) #define RII(N,M) scanf("%d %d",&(N),&(M)) #define RIII(N,M,K) scanf("%d %d %d",&(N),&(M),&(K)) #define mem(a) memset((a),0,sizeof(a)) using namespace std; const int inf=1e9; const int inf1=-1*1e9; double EPS=1e-10; typedef long long LL; int main() { int t; RI(t); while(t--) { int n,s; RII(n,s); int a[15]; int mark[1<<n]; int ans[1<<n]; for(int i=0; i<n; i++) RI(a[i]); int sum[1<<n]; for(int i=0; i<=(1<<n)-1; 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 ) - 1; i++) { mark[i]=(sum[i]==s); for(int j=(i-1)&i; j; j=(j-1)&i) { mark[i]|=(sum[j]+s==sum[i-j]||sum[j]-s==sum[i-j]); } } for(int i=0; i<=(1<<n)-1; i++) { ans[i]=mark[i]; for(int j=i&(i-1); j; j=(j-1)&i) { ans[i]=max(ans[i],ans[j]+ans[i-j]); } } cout<<ans[(1<<n)-1]<<endl; } return 0; }
相关文章推荐
- 23种设计模式(1):单例模式
- 《java入门第一季》之面向对象(多态练习)
- Android5.0(L)输入法表情界面㊗和㊙显示框框
- 《java入门第一季》之面向对象(多态练习)
- maven 配置篇 之pom.xml
- iOS端播放VR图片
- 对于servlet初步理解
- 如何邀请好友注册您的网站(模拟百度网盘)
- JSON转换为DataTable
- easyUi 管理页切换
- 如何快速在一个陌生领域做到优秀水平?
- 设计模式之原型模式(Prototype)
- iOS label根据显示内容自适应大小 时间 2015-12-04 16:39:00 博客园-原创精华区 原文 http://www.cnblogs.com/czq1989/p/5019720.
- EventBus使用介绍
- VSYNC信号传递流向
- 用canvas画一颗花心
- Mybatis学习总结
- 训练计划,专题
- Ubuntu Unable to run mksdcard SDK tool 解决办法
- 邮件推送产品