URAL1326. Bottle Taps(状压)


1326

用队列优化的 不知道为什么一直WA 传统直白的 状压 写了超时 O((1<<n)*m*n) 之后想了可以把n省去 预处理一下方案

 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<stdlib.h>
 6 #include<vector>
 7 #include<cmath>
 8 using namespace std;
 9 #define N 1100000
10 #define INF 0xfffffff
11 int dp[2][N];
12 int p[25],o[110],sum[110];
13 vector<int>a[110];
14 bool f[2][N],ff[25];
15 int main()
16 {
17     int i,j,n,m,v,s=0;
18     cin>>n;
19     for(i = 1; i <= n ; i++)
20     cin>>p[i];
21     cin>>m;
22     for(i = 1; i <= m ;i++)
23     {
24         int k,b;
25         cin>>o[i]>>k;
26         for(j = 1; j <= k ; j++)
27         {
28             cin>>b;
29             sum[i]+=(1<<(b-1));
30         }
31     }
32     cin>>v;
33     for(i = 1; i <= v ; i++)
34     {
35         int x;
36         cin>>x;
37         ff[x] = 1;
38         s+=(1<<(x-1));
39     }
40     int tt[2]={0};
41     tt[0]=1;
42     for(i =0  ;i < (1<<n) ; i++)
43     dp[0][i] = dp[1][i] = INF;
44     for(i = 0; i < (1<<n)  ; i++)
45     {
46         int pp=0,flag=1;
47         for(j = 0 ; j < n ; j++)
48         {
49             if(i&(1<<j))
50             {
51                 if(!ff[j+1]) flag=0;
52                 pp+=p[j+1];
53             }
54         }
55         if(!flag) continue;
56         dp[0][i] = pp;
57     }
58     for(i = 1; i <= m ;i++)
59     {
60         int t1 = i%2,t2 = (i-1)%2;
61         for(j = 0 ; j < (1<<n) ; j++)
62         {
63             dp[t1][j] = min(dp[t1][j],dp[t2][j]);
64             if(dp[t2][j]==INF) continue;
65             dp[t1][j|sum[i]] = min(dp[t1][j|sum[i]],dp[t2][j]+o[i]);
66         }
67     }
68     int minz = INF;
69     for(i = 0 ; i < (1<<n) ; i++)
70     {
71         if((s&i)==s)
72         {
73             minz = min(minz,min(dp[0][i],dp[1][i]));
74         }
75     }
76     cout<<minz<<endl;
77     return 0;
78 }
View Code

优质内容筛选与推荐>>
1、加密解密
2、分布式系统中接口的幂等性
3、架构模式: 服务注册表
4、1、function aa(){}和 var aa=function(){}的区别:
5、人民币 大写转换


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn