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));
}
}
分享到:
相关推荐
#### 二、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**:简单的线段树题目,要求求解区间乘积。在节点中维护区间乘积...
#### 二、动态规划 动态规划是一种重要的算法思想,主要用于解决具有重叠子问题和最优子结构的问题。 - **状态定义**:明确问题的状态空间,定义状态转移方程。 - **状态转移**:确定如何从已知状态转移到目标状态...
- 解决ZOJ等网站上的难题 - 参加各类在线比赛,体验比赛氛围 - 对已解决的题目进行深入分析,探索更优解法 通过以上训练计划,可以在短时间内迅速提高算法和编程能力,更好地应对各种类型的ACM竞赛。
- **浙江大学微软技术俱乐部**和**ZOJ**(在线评测系统)是训练和选拔优秀选手的重要平台。 - **参考书籍**:《C++ Primer》、《C++标准程序库》、《算法导论》、《算法艺术与信息学竞赛》等是深入学习的基础资料...
#### 2.2 Zhejiang University ACM Online Judge (ZOJ) - **网址**: http://acm.zju.edu.cn - **特点**: - 由浙江大学维护,题目难度适中,适合练习ACM竞赛题目。 - 界面简洁,易于上手。 #### 2.3 Sichuan ...
#### 二、在线评测系统(Online Judge,简称OJ) - **USACO (United States of America Computing Olympiad)**:美国信息学奥林匹克竞赛官方网站,提供不同难度级别的训练题和比赛。 - **TJU (Tongji University On...
- **浙江大学在线评测系统(ZOJ)**:这是一个常用的在线评测平台,提供了丰富的题目资源和即时反馈机制。 - **提交代码**:介绍如何在ZOJ平台上注册账户、提交代码以及查看评测结果的过程。 #### 3. C++ STL泛型...
- **平台**: 例如浙江大学在线评测系统 (ZOJ)。 - **功能**: 在线提交代码、获取即时反馈。 - **流程**: - 注册账号并登录。 - 查看题目描述和要求。 - 编写并提交代码。 - 获取评测结果,根据结果调整代码直至...
#### 二、编程语言的选择 **1. 语言的重要性** 无论在哪个领域,编程语言都是基础中的基础。在信息学竞赛中,常见的支持语言包括C/C++和Java。选择合适的语言对于参赛者来说至关重要。 **2. Java的局限性** - **...
- **网格**:在二维或三维空间中处理格点问题,常用于搜索和路径规划。 - **圆**:圆的性质,如圆心、半径、弦、弧等,以及与圆相关的几何运算。 - **整数函数**:在处理整数特性的题目时,这些函数能提供高效和...
- 凸包问题:寻找二维平面上一组点构成的最小凸多边形。 - 最近点对:在二维平面上找出距离最近的两个点。 - **网络流** - **定义**:网络流问题是研究如何在网络中从源点到汇点的最大流量。 - **应用场景**: ...
### ZOJ全部题目分类详解 #### 一、概述 ZOJ(Zhejiang Online Judge)作为一项在线编程竞赛平台,提供了丰富的算法题目供学习者练习。本文将根据所提供的文件中的“初学者题”、“模拟问题”、“动态规划”及...