URAL 1326(状态压缩DP)
2016-02-03 23:41
399 查看
题目链接:URAL 1326
解题思路:
状态压缩DP,也就是集合的DP,思路跟TSP问题很相似。需要注意的就是可以买多T^T
代码:
总结:
思路其实相当明显,只是一开始看的时候不相信这么高的复杂度能过~
解题思路:
状态压缩DP,也就是集合的DP,思路跟TSP问题很相似。需要注意的就是可以买多T^T
代码:
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define INF 0x3f3f3f3f using namespace std; const int MAXN = 1<<20; int n,m,dp[MAXN+5],a[120+5],w[120+5]; int main() { while(~scanf("%d",&n)) { for(int i=1;i<=n;i++) { scanf("%d",&a[i]); w[i] = 1<<(i-1); } scanf("%d",&m); int t,tmp,index=0,ans=INF; for(int i=1;i<=m;i++) { scanf("%d %d",&a[i+n],&t); while(t--) { scanf("%d",&tmp); w[i+n] |= 1<<(tmp-1); } } scanf("%d",&t); while(t--) { scanf("%d",&tmp); index |= 1<<(tmp-1); } memset(dp,INF,sizeof(dp)); dp[0]=0; for(int i=1;i<=n+m;i++) { for(int j=0;j<(1<<n);j++) { if(j&w[i]) dp[j] = min(dp[j], dp[j-(j&w[i])] + a[i]); } } for(int i=0;i<(1<<n);i++) if((index&i)==index) ans=min(ans,dp[i]); printf("%d\n",ans); } return 0; }
总结:
思路其实相当明显,只是一开始看的时候不相信这么高的复杂度能过~
相关文章推荐
- 51Nod 1057 N的阶乘(数论)
- Android权限管理
- DOM的高级操作——表单的添加/删除/获取
- POJ2663 完美覆盖
- ASP.NET MVC 自定义后缀路由设置
- ASP.NET MVC 自定义后缀路由设置
- php session实现多级目录存放实现代码
- JAVA中的Jar
- 数据结构之B树B+树
- ubuntu 开启ip包转发
- Struts2-03-OGNL表达式
- 名词解释之人身险理赔
- hdoj 2061 Treasure the new start, freshmen!
- 一些感想
- Merge Two Linked List
- 自己都找不到自己
- 杭电1017 A Mathematical Curiosity
- Web开发进阶之Servlet理解
- Laravel 5.2 使用illuminate/html 报错的问题
- 欢迎使用Markdown编辑器写博客