芒课 —— 2464试题
题目描述
谢老师准备建设自己的题库,由于工作量实在太大了,他决定请他的N个学生来帮忙,但是有的同学待在一起就会讲话,不好好干活。他认真观察后发现有m对同学在一起就会互相讲话,所以这m对同学不能同时请来帮忙。
现状谢老师想知道,他请学生帮忙能有多少种不同的方案,请帮助他回答这个问题。
输入说明
第一行两个整数n, m(1 ≤ n ≤ 20,1 ≤ m ≤ 400)。
加下来m行,每行两个不同的整数x,y,表示x同学和y同学在一起就会聊天。
输出说明
一个整数,表示满足条件的方案数。
输入样例
3 2 1 2 2 3
输出样例
5
算法分析
可以采用分治的思想来实现。
用一个二维数组来记录学生之间两两是否会说话,用一个一位数组记录每轮递归中哪些学生已经被选择过。
第一轮先选中第1个学生,然后从第2个学生开始比较,如果第2个学生和第一个学生会相互说话且第一个学生已经被选择了,就不能选第2个学生,只能跳过去选第3个学生(这样一轮一共需要考虑n个学生)。
后面第二轮从第2个学生开始选择,以此类推,求出所有的方案数。
具体代码实现如下:
C++代码
#include <iostream>
// #include <cstdio>
// #include <cstdlib>
// #include <cmath>
#include <numeric>
// #include <iomanip>
#include <vector>
// #include <algorithm>
// #include <utility>
// #include <string>using std::cin;
using std::cout;
using std::endl;
// using std::string;
using ivec = std::vector<int>;
int n, count = 0; void countFromI(std::vector<ivec> &stuRelation, ivec &stuChosen, int i) {// 从第i个学生开始计算,共有多少可选方for (int j = i + 1; j <= n; ++j) {stuChosen[j] = 1; // 先假设能选择jfor (int k = 1; k < j; ++k) {if (stuRelation[k][j] && stuChosen[k]) { // 如果在已经选择的前k个同学中,有人会和j说话,则不能选择jstuChosen[j] = 0;break;}}if (stuChosen[j]) { // 如果确定j是可以选择的// 计算选或不选第j个同学的两种情况下,可以有多少选择方案++count;countFromI(stuRelation, stuChosen, j); // 如果选了j,就产生了一种新的方案stuChosen[j] = 0;} else {continue; // 如果没选j,则跳过j继续往下算}}
}int main() {int m;cin >> n >> m; ivec stuChosen(n+1, 0); // 用于判断学生是否被选中,1表示该学生已被选中,0表示该学生未被选中std::vector<ivec> stuRelation(n+1, ivec(n+1, 0)); // 学生关系二维矩阵for (int stu1, stu2, i = 0; i < m; ++i) {cin >> stu1 >> stu2;stuRelation[stu1][stu2] = stuRelation[stu2][stu1] = 1; // 1表示两个学生会互相说话,0表示两个学生不会相互说话,实际处理时只需要关注学生关系的上三角矩阵}// 每轮从第i个学生开始计算方案数,j遍历从i到n的每一个学生for (int i = 1; i < n; ++i) {stuChosen[i] = 1; // 选中第i个学生countFromI(stuRelation, stuChosen, i);stuChosen[i] = 0; // 重置stuChosen列表}cout << count + n + 1 << endl; // 加上只单独请一个学生帮忙,以及不请学生帮忙的情况return 0;
}
补充说明
注意vector作为参数传递给函数时,如果采用值传递会发生拷贝构造。如果这个函数还被递归调用,就会造成非常大的资源浪费。而使用引用传递就不会发生拷贝构造,详解可见:vector作为参数的三种传参方式
芒课 —— 2464试题相关推荐
- 小学计算机课考试试题,小学信息技术新课程标准试题及部分答案
小学信息技术新课程标准试题及部分答案 一.填空.(25分) 1.新课程整体设置(九年一贯制 )的义务教育课程. 2.新课程小学阶段以(综合课程 )为主. 3.新课程从小学设置(综合实践活动)并作为必修 ...
- 前锋linux试题,大学篮球考试题库.doc
大学篮球考试题库 篮球选项课理论试题库 一.填空 基础部分 1.现代篮球运动是1895年由美国国际基督教青年协会派往中国( 天津 )青年会第一任总干事来会理介绍传入我国. 2.1910年旧中国第1届全 ...
- 北师大计算机在线作业答案0651,北师大版五年级数学上册全册教学同步练习随堂测试一课一练电子作业3份.docx...
北师大版五年级数学上册全册教学同步练习随堂测试一课一练电子作业3份.docx 每课有试题三套.内容丰富.题型多样,可用做随堂练习.课后作业.电子作业和每课小测,这些只需要您抢得一个小红包<精打细 ...
- word使用计算机题,巧用Word编题库
题库建设是教育资源建设的重要组成部分,同时也是中小学一线学科教师日常教学研究和考试研究的重要途径和抓手.本文讲述Word 2010技巧在编写题库中的具体应用. 目前网络上流行多款基于数据库技术并以Mi ...
- 蓝桥杯单片机设计与开发_标准模板
蓝桥杯单片机设计与开发_标准模板 一.前言 首先,这篇文章是笔者第一次在 CSDN 上写博文,较为生疏,读者若有任何意见,欢迎大家在评论区交流! 笔者目前为一名大二学生,参加了2021年蓝桥杯单片机设 ...
- 高三物理教学工作计划
新的一学年已经开始,为了把教学工作做实做细,全面贯彻课改精神,提升教学质量,力争在20xx年的高考中取得优异的成绩,本学期在上学年高三教学工作的基础上总结经验.改善不足,现拟定本学期教学工作计划如下: ...
- 情书生成器代码_微软飞行模拟器是对航空的情书
情书生成器代码 The newest entry in the nearly 40-year-old game series just may be the best one yet. 近40年历史的 ...
- 12个学霸都在用的学习神器,让你的学习效率翻几倍!
分享12个超级好用的学习APP,涵盖了提升个人效率.英语考研.专业课程.搜题神器,绝对值得收藏! 1.Notability 一个简约但强大的笔记与PDF注释软件,下载的电子版课件或学习资料都可以用它进 ...
- 二级建造师怎么备考?
不难,只要你认真备考,通过考试是没什么问题的. 二建考试考3科目:法规+管理+实务(建筑工程.公路工程.水利水电工程.市政公用工程.矿业工程和机电工程等6个专业) 给大家分享一下备考方法,希望对你有帮 ...
最新文章
- MySQL中字段约束有哪些_mysql字段约束
- 华为合作oppovivo小米鸿蒙,华为鸿蒙成功的关键:要让小米、OPPO、VIVO都用上鸿蒙...
- Digg:私人制造的时代
- 大型网站技术架构(二)--大型网站架构演化
- Harbor:私有企业级Registry仓库--快速搭建
- leetcode162. 寻找峰值(二分法)
- 红包指定分配金额php,php仿微信红包分配算法的实现方法_PHP
- poj2586 Y2K Accounting Bug
- c#实现SQLServer存储照片,并读取照片
- 大数据好还是不好_学python好还是大数据好?想学IT,但有点搞不清方向的人可以看看...
- linux python2.7 mssqlserver_连接到linux上的MSSQL Server 2008
- python-fire的使用
- Hibernate之DetachedCriteria、Criteria
- c语言游戏计算器代码,C语言计算器代码.doc
- 计算机类专业数学分数,同济大学计算机专业数学分数
- python qq群_用Python玩转QQ群论坛
- 【解决Windows】修改win10默认开机启动动画
- linux 中cat用法
- 事件图谱的构建、推理与应用
- OneRel: Joint Entity and Relation Extraction with One Module in One Step