• (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;
    }
    

      

  • 相关阅读:
    智慧城市顶层设计策略方案(PPT)
    ant build.xml 解释!
    Excel poi API基础教程!
    操纵Excel文件的 ExcelUtil 类 !
    在selenium测试中使用XPATH功能函数starts-with、contains、descendant、ancestor、text()定位网页元素
    [ Selenium2 从零开始 by Bruce from http://seleniumcn.cn ] 1-8 视频集锦
    selenium 概念及练习 !
    selenium Object Page 设计模式理解及实现!
    使用TestNG 和 CSV文件进行数据驱动
    如何让评审人爱上我
  • 原文地址:https://www.cnblogs.com/water-full/p/4529746.html
Copyright © 2020-2023  润新知