HDU 3182【状压DP--easy】
2015-09-02 20:47
295 查看
挺简单的。。然而还是想了一会。。。感觉自己脑袋还不是很清醒。。TAT。。。自己脑袋里老是有些奇奇怪怪的小细节。。TAT
#include <stdio.h> #include <iostream> #include <string.h> using namespace std; #define maxn 40000 class node { public: int cost,sum; }dp[maxn]; class nodee { public: int v,e,need; }a[16]; int bina[16],n,total; int vis[maxn]; void init() { for(int i=0;i<16;i++) bina[i]=1<<i; } int max(int x,int y){return x>y?x:y;} void work() { memset(vis,0,sizeof(vis)); int maxnum=1<<n; dp[0].cost=0,dp[0].sum=0; vis[0]=1; for(int j=0;j<maxnum;j++) { for(int i=0;i<n;i++) { if(!vis[j]) continue; if((j&bina[i])==0) { int now=j|bina[i]; if((j&a[i].need)==a[i].need) { if(vis[now]) { if(a[i].e+dp[j].cost<=total) { if(dp[now].sum<dp[j].sum+a[i].v) dp[now].sum=dp[j].sum+a[i].v; else if(dp[now].sum==dp[j].sum+a[i].v) if(a[i].e+dp[j].cost<dp[now].cost) dp[now].cost=a[i].e+dp[j].cost; } } else if(a[i].e+dp[j].cost<=total) { dp[now].sum=dp[j].sum+a[i].v; dp[now].cost=dp[j].cost+a[i].e; vis[now]=1; } } } } } int ans=0; for(int i=0;i<maxnum;i++) if(vis[i]) ans=max(ans,dp[i].sum); cout<<ans<<endl; } int main() { int T; cin>>T; init(); while(T--) { cin>>n>>total; for(int i=0;i<n;i++) { cin>>a[i].v; } for(int i=0;i<n;i++) { cin>>a[i].e; } for(int i=0;i<n;i++) { int m,tmp=0,x; cin>>m; for(int j=0;j<m;j++) { cin>>x; tmp+=bina[--x]; } a[i].need=tmp; } work(); } return 0; }
相关文章推荐
- C++重载操作符总结
- c++ set multiset
- 用定时器在数码管上依次扫描出1,2,3,4
- 黑马程序员—集合框架(1)
- Java构造器和方法的区别
- 基于ATmega64的液晶12864学习心得(一)
- java语言中解决一些安全问题的技巧(安全编程非常重要标签)
- HDU——2105 The Center of Gravity
- 关于JavaScript中没有块级作用域的理解
- 需求:过滤下面这个网页里共723行 校对中里 行数为两位数的 行 并设置sz和rz在Windows和Linux之间发送和接收文件不用搭FTP
- Java使用eclipse新建枚举报出, 项目“xxxxx”不是符合 J2SE 5.0 的项目。的解决办法
- Java集合架构
- Windows自带的造字功能使用
- 宏和预处理
- Redis的几点积累
- 第八篇 SQL Server安全数据加密
- liferay6.2弹出层,弹出窗
- LNMP环境搭建
- C语言反向链式栈的实现
- NYOJ动态规划最长公共子序列+二位数组递推dp