`
linest
  • 浏览: 155635 次
  • 性别: Icon_minigender_1
  • 来自: 内蒙古
社区版块
存档分类
最新评论

ZOJ-3305* 二进制子集划分

    博客分类:
  • acm
 
阅读更多
3305:有N中调料,M种配方。调料每种只能用一次,求能实现多少种配方。
即统计能划分出多少备选子集。


思路:本题代码参考自http://akheyun.blog.163.com/blog/static/13824927620102183300293/
核心思想是二进制表现。
x = (x - 1) & st 实现了子集遍历
比如 st=1110
1101 & 1110 = 1100
1011 & 1110 = 1010
1001 & 1110 = 1000
0111 & 1110 = 0110
0101 & 1110 = 0100
0011 & 1110 = 0010
0001 & 1110 = 0000

联想起求一个数的二进制中1有多少。
用到 x = (x-1) & x  这每次会使一个1变为0 用时可以小于O(n)

#include<iostream>
using namespace std;
#include<stdio.h>
#include<memory.h>

const int M = 1 << 16 + 1;
bool a[M];
int dp[M];

int solve(int st)
{
         int i;
         if (dp[st] != -1) return dp[st]; //已经计算过,直接返回
         dp[st] = 0;
         for (int x = st; x != 0; x = (x - 1) & st)
         {
               //不使用x能达到的配方数和使用x后配方数的最大值
               if (a[x])
                   dp[st] = max(dp[st], solve(st - x) + 1);
         }
         return dp[st];
}

 

int main ()
{

         int i, j, n, m, k, p;
         while (scanf("%d%d", &n, &m) != EOF)
         {
               memset(a, false, sizeof(a));
               memset(dp, -1, sizeof(dp));

               for (i = 0; i < m; i++)
               {
                    scanf("%d", &k);
                    j = 0;
                    while (k--)
                    {
                          scanf("%d", &p);
                          j += (1 << (p - 1)); //每种配方用2进制表示
                    }
                    a[j] = 1;
               }            

			   //初始全为1传入
               printf("%d\n", solve((1 << n) - 1));
         }

}


分享到:
评论

相关推荐

    ACM算法经典书籍----最全最详细的书籍推荐!

    #### 二、Algorithms - **书名**: *Algorithms* - **作者**: Robert Sedgewick 和 Kevin Wayne - **特点**: 本书不仅包含了算法的基本概念,还提供了大量的实际例子和实现细节。 - **适用人群**: 对于希望深入了解...

    在线判断-算法题

    ZOJ (Zhejiang University Online Judge) - **特点**:浙江大学主办的在线编程平台。 - **适用对象**:ACM竞赛选手。 - **优势**:与高校合作紧密,实战经验丰富。 ### 17. CodeChef - **特点**:印度的一家在线...

    欧拉回路题集

    1. **Strange Country II (ZOJ-3332) 竞赛图** - **题目描述**:在一种特殊的图——竞赛图中寻找哈密顿回路。 - **解题思路**:竞赛图中每个节点的入度和出度都为1,因此可以按照顺序构造哈密顿回路。 - **数据...

    线段树题目

    - **ZOJ 2859**:涉及到二维线段树的应用,需要求解矩阵的部分最大值。这通常需要在二维空间中构建线段树,并支持区间查询和更新操作。 - **HDU 3074**:简单的线段树题目,要求求解区间乘积。在节点中维护区间乘积...

    acm新手训练方案新手必备

    #### 二、动态规划 动态规划是一种重要的算法思想,主要用于解决具有重叠子问题和最优子结构的问题。 - **状态定义**:明确问题的状态空间,定义状态转移方程。 - **状态转移**:确定如何从已知状态转移到目标状态...

    ACM练习题库

    - 解决ZOJ等网站上的难题 - 参加各类在线比赛,体验比赛氛围 - 对已解决的题目进行深入分析,探索更优解法 通过以上训练计划,可以在短时间内迅速提高算法和编程能力,更好地应对各种类型的ACM竞赛。

    Acm竞赛常用算法与数据结构

    - **浙江大学微软技术俱乐部**和**ZOJ**(在线评测系统)是训练和选拔优秀选手的重要平台。 - **参考书籍**:《C++ Primer》、《C++标准程序库》、《算法导论》、《算法艺术与信息学竞赛》等是深入学习的基础资料...

    OnlineJudge站点网址

    #### 2.2 Zhejiang University ACM Online Judge (ZOJ) - **网址**: http://acm.zju.edu.cn - **特点**: - 由浙江大学维护,题目难度适中,适合练习ACM竞赛题目。 - 界面简洁,易于上手。 #### 2.3 Sichuan ...

    acm 资料大全 程序 设计 竞赛 icpc

    #### 二、在线评测系统(Online Judge,简称OJ) - **USACO (United States of America Computing Olympiad)**:美国信息学奥林匹克竞赛官方网站,提供不同难度级别的训练题和比赛。 - **TJU (Tongji University On...

    acm程序设计曾宗根

    - **浙江大学在线评测系统(ZOJ)**:这是一个常用的在线评测平台,提供了丰富的题目资源和即时反馈机制。 - **提交代码**:介绍如何在ZOJ平台上注册账户、提交代码以及查看评测结果的过程。 #### 3. C++ STL泛型...

    国际大学生程序设计竞赛指南—ACM程序设计

    - **平台**: 例如浙江大学在线评测系统 (ZOJ)。 - **功能**: 在线提交代码、获取即时反馈。 - **流程**: - 注册账号并登录。 - 查看题目描述和要求。 - 编写并提交代码。 - 获取评测结果,根据结果调整代码直至...

    在线online judge

    #### 二、编程语言的选择 **1. 语言的重要性** 无论在哪个领域,编程语言都是基础中的基础。在信息学竞赛中,常见的支持语言包括C/C++和Java。选择合适的语言对于参赛者来说至关重要。 **2. Java的局限性** - **...

    浙大acm最新模板!

    - **网格**:在二维或三维空间中处理格点问题,常用于搜索和路径规划。 - **圆**:圆的性质,如圆心、半径、弦、弧等,以及与圆相关的几何运算。 - **整数函数**:在处理整数特性的题目时,这些函数能提供高效和...

    备战ACM资料 DP问题等

    - 凸包问题:寻找二维平面上一组点构成的最小凸多边形。 - 最近点对:在二维平面上找出距离最近的两个点。 - **网络流** - **定义**:网络流问题是研究如何在网络中从源点到汇点的最大流量。 - **应用场景**: ...

    ZOJ全部题目分类(分得很细哦)

    ### ZOJ全部题目分类详解 #### 一、概述 ZOJ(Zhejiang Online Judge)作为一项在线编程竞赛平台,提供了丰富的算法题目供学习者练习。本文将根据所提供的文件中的“初学者题”、“模拟问题”、“动态规划”及...

Global site tag (gtag.js) - Google Analytics