zoukankan      html  css  js  c++  java
  • (DP) zoj 3305

    Get Sauce

    Time Limit: 5 Seconds      Memory Limit: 32768 KB

    In order to celebrate the 8th anniversary of ZOJ, LCLL goes to a sauce factory to "Get Sauce". The factory has N kinds of materials. If we combine some of them, we will get a bottle of sauce. LCLL is a sauce genius, he knows about M ways to make the sauce with these materials. Now LCLL wants to get as many bottles of sauce as possible, but he can use each kind of material only once. How many bottles of sauce will LCLL take home at most?

    Input

    The input file will contain multiple test cases. Each case contains two integers N and M(0 <=N <= 16, 0<= M <=50,000), then there are M lines, each line describe a way to make sauce like this: K a1,a2...aK where K(1<=K<=N) is the number of kinds of materials, ai is a number between[1,N] represents a kind of material this way needs.

    Process to the end-of-file.

    Output

    For each test case print a single line that contains the number of the bottles of sauce LCLL will get at most.

    Sample Input

    5 3
    2 1 2
    2 2 3
    2 3 4
    
    5 2
    1 1
    4 1 2 3 4
    

    Sample Output

    2
    1
    

    Author: CHAO, Jiansong
    Source: ZOJ 8th Anniversary Contest

    学习到了求一个集合所有子集的方法。。。

    j=ret;j;j=(j-1)&ret

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<cmath>
    #include<algorithm>
    #include<cstdlib>
    using namespace std;
    int n,m,dp[(1<<16)+10];
    int main()
    {
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            int ret=(1<<n)-1;
            memset(dp,0,sizeof(dp));
            for(int i=1;i<=m;i++)
            {
                int k,x,st=0;
                scanf("%d",&k);
                while(k--)
                {
                    scanf("%d",&x);
                    st=st|(1<<(x-1));
                }
                int ed=ret^st;
                dp[st]=max(dp[st],1);
                for(int j=ed;j;j=(j-1)&ed)
                {
                    if(dp[j]==0)
                        continue;
                    dp[st|j]=max(dp[st|j],dp[j]+1);
                }
            }
            int ans=0;
            for(int i=1;i<(1<<n);i++)
            {
                if(dp[i]>ans)
                    ans=dp[i];
            }
            printf("%d
    ",ans);
        }
        return 0;
    }
    

      

  • 相关阅读:
    Codeforces 358 D. Dima and Hares
    sublime Text3配置及快捷键、插件推荐总结
    免费WiFi,仅仅为好久没联系的你们
    史上最简单的带流控功能的http server
    微软2014校园招聘笔试试题
    python 3Des 加密
    MySQL slave状态之Seconds_Behind_Master
    APP安全环节缺失,手游运营商怎样应对APP破解困境
    读完了csapp(中文名:深入理解计算机系统)
    static使用方法小结
  • 原文地址:https://www.cnblogs.com/water-full/p/4529746.html
Copyright © 2011-2022 走看看