uva1507(状态压缩+dfs)
2015-08-14 17:03
357 查看
题意:
给出我们n种物品,每种物品都有五个值,分别是a、b、c、d、e,我们要在这n个物品中选出k个,使得这k个物品中的max{a}+max{b}+max{c}+max{d}+max{e}最大,输出最大值。
思路:
n的范围有10000,而每个人只有五个值,我们不能从n入手,可以从这五个值入手。
五个值,我们可以用二进制进行压缩,对于一个物品,我们用00000~11111来表示所有情况,如果某一位是1代表我们最后要取走这个物品的那个值,如10000代表我们取走a,
我们把所有物品的这32个值(00000~11111)预处理出来,然后跑dfs就可以了。
代码:
给出我们n种物品,每种物品都有五个值,分别是a、b、c、d、e,我们要在这n个物品中选出k个,使得这k个物品中的max{a}+max{b}+max{c}+max{d}+max{e}最大,输出最大值。
思路:
n的范围有10000,而每个人只有五个值,我们不能从n入手,可以从这五个值入手。
五个值,我们可以用二进制进行压缩,对于一个物品,我们用00000~11111来表示所有情况,如果某一位是1代表我们最后要取走这个物品的那个值,如10000代表我们取走a,
我们把所有物品的这32个值(00000~11111)预处理出来,然后跑dfs就可以了。
代码:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> #include<vector> #include<map> #include<stack> #include<cmath> #include<cstdlib> #include<climits> #include<sstream> using namespace std; int n,k; int num[1050][10]; int state_max[50]; int dfs(int state,int num) { if(num==0) return 0; int ans=0; for(int i=state;i>0;i=(i-1)&state) { // printf("s0=%d\n",i); int tmp=dfs((i^state),num-1)+state_max[i]; ans=max(ans,tmp); } return ans; } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&k); for(int i=0;i<n;i++) for(int j=0;j<5;j++) scanf("%d",&num[i][j]); memset(state_max,0,sizeof state_max); for(int i=0;i<n;i++) for(int j=0;j<=31;j++) { int tmp=0; for(int k=0;k<5;k++) { if((1<<k)&j) tmp+=num[i][k]; } state_max[j]=max(state_max[j],tmp); } int ans=dfs(31,k); printf("%d\n",ans); } return 0; }
相关文章推荐
- 官方 NSIS 插件全集简单介绍
- java 或者 js 获取项目访问路径(域名)
- Android Train—notification通知
- SQL 约束
- STL之vector详解
- 回归、插值、拟合(1)--区别于联系
- Toast Dialog的封装(一)
- gravity和layout_gravity的区别
- 再学Java进阶篇 数组与字符串
- Map的遍历方式
- 怎样利用代码与习惯提高网站的并发访问性能以及自己的一些疑惑
- SQL Server 数据的添加修改删除和查询
- C#调用java程序
- 让EditText失去焦点,进入后不会选中的解决方法
- 表的基本操作
- HDOJ 5389 Zero Escape DP
- HDU 1160 FatMouse's Speed(动态规划)
- Linux脚本重定向
- Win7 下面安装MongoDB
- hadoop权威指南(第四版)要点翻译(4)——Chapter 3. The HDFS(1-4)