NEFU559 分书问题【递归】

题目链接:

http://acm.nefu.edu.cn/JudgeOnline/problemshow.php?problem_id=559

题目大意:

有编号分别为1~N的N本书,准备分给N个人,每个人阅读兴趣用一个二维数组表示。

1:喜欢这本书;0:不喜欢这本书。

Like[i][j] = 1,i喜欢书j;Like[i][j] = 1,i不喜欢书j。

问:如何分书才能使得所有人都满意,输出第i个人分得的书的编号,如果有多个答案

输出序列数小的那一组。

思路:

序列要求从小到大,那么就从小到大递归美剧每个人喜欢的书,找到第一组答案就可以

了。用vis[]数组来判断第i本书是否被选,ans[]数组来存储输出序列。从第一个人开始选

书,到最后一个人选完书,对于每个人,找出未被选、并且自己喜欢的书进行选择,并

用vis[]标记,将序列号存入ans[]数组。然后判断剩下的人是否满足人手一本的条件(递归

判断),如果不能则将vis[]还原(恢复现场),表示不能选择该书。

AC代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;

int Like[130][130],vis[130],ans[130],N;

int search(int M)
{
	if(M == N)
		return true;
	for(int i = 0;i < N; ++i)	//判断第i本书是否备选,第M个人是否喜欢第i本书
	{
		if(!vis[i] && Like[M][i])
		{
			vis[i] = 1;
			ans[M] = i+1;		//第M个人选了第i本书
			if(search(M+1))		//剩下的能否人手配一本,可以就返回
				return 1;
			vis[i] = 0;			//不可以人手配一本,就不能选择第i本书(恢复现场)
		}
	}
	return 0;
}
int main()
{
	while(~scanf("%d",&N))
	{
		for(int i = 0; i < N; ++i)
			for(int j = 0; j < N; ++j)
				scanf("%d",&Like[i][j]);
		memset(vis,0,sizeof(vis));
		memset(ans,0,sizeof(ans));
		search(0);
		for(int i = 0; i < N; ++i)
			if(i != N-1)
				printf("%d ",ans[i]);
			else
				printf("%d\n",ans[i]);
	} 

	return 0;
}
时间: 2024-07-29 18:22:36

NEFU559 分书问题【递归】的相关文章

算法--递归策略

本文地址:http://www.cnblogs.com/archimedes/p/algorithm-recursion.html,转载请注明源地址. 递归的概念与基本思想 一个函数.过程.概念或数学结构,如果在其定义或说明内部又直接或间接地出现有其本身的引用,则称它们是递归的或者是递归定义的.在程序设计中,过程或函数直接或者间接调用自己,就被称为递归调用. 递归的实现方法 递归是借助于一个递归工作栈来实现:递归=递推+回归: 递推:问题向一极推进,这一过程叫做递推:这一过程相当于压栈. 回归:

PHP_递归实现无限级分类

<?php /** * 递归方法实现无限级别分类 * @param array $list 要生成树形列表的数组[该数组中必须要有主键id 和 父级pid] * @param int $pid=0 父级id * @param int $level=0 缩进次数[用于指定分类名称要缩进的数量] */ function getTree($list,$pid=0,$level=0 ) { // static 表示声明一个静态变量, 静态变量在函数中会一直保存它的值 static $tree = arr

3.sql中的向上递归和向下递归

1.向下递归 select * from table_name where 条件 connect by prior bmbm(本级关联条件)=sjbmbm(上级关联条件) start with bmbm(本级关联条件)='610000000000'(本级编码)--包含本级 select * from table_name where 条件 connect by prior bmbm(本级关联条件)=sjbmbm(上级关联条件) start with sjbmbm(本级关联条件)='6100000

斐波那契数列的递归和非递归解法

//递归解法 function fib(n){ if(n < 1){ throw new Error('invalid arguments'); } if(n == 1 || n == 2){ return 1; } return fib(n - 1) + fib(n - 2); } //非递归解法 function fib(n){ if(n < 1){ throw new Error('invalid arguments'); } if(n == 1 || n == 2){ return 1

python3 递归

递归调用: 在调用一个函数的过程中,直接或者简介调用了该函数本身 必须有一个明确的结束条件 l = [1,[2,3,[4,5,[6,7,[8,9,[10,11,[12,13]]]]]]] def func(l): for i in l: if isinstance(i,list): func(i) else: print(i) func(l) 应用场景:不知道应该循环多少次,只知道什么时候应该结束

day05匿名函数,内置函数,二分法,递归,模块

yield作为表达式来使用的方式 #grep -rl 'python /root """ 查找root下文件中含有python的文件 """ import os def init(func): def wrapper(*args,**kwargs): g=func(*args,**kwargs) next(g) return g return wrapper @init def search(target): while True: search

浅谈递归调用的个人领悟

从大一开始学c,就不是挺理解递归的,最近突然有所体会: 递归调用中递归调用的函数可以把它想象成为一个树的结点,在函数中调用自身就是一个分支,直到出口条件时就是这棵树的叶子结点.叶子的值便是出口返回的值.最后从叶子结点按照你所调用的方法向上返回值,最终结束递归调用.

用递归和非递归的方法输出斐波那契数列的第n个元素(C语言实现)

费波那契数列(意大利语:Successione di Fibonacci),又译为费波拿契数.斐波那契数列.费氏数列.黄金分割数列. 在数学上,费波那契数列是以递归的方法来定义: {\displaystyle F_{0}=0} {\displaystyle F_{1}=1} {\displaystyle F_{n}=F_{n-1}+F_{n-2}}(n≧2) 用文字来说,就是费波那契数列由0和1开始,之后的费波那契系数就是由之前的两数相加而得出.首几个费波那契系数是: 0, 1, 1, 2, 3

Java递归流程

递归二字顾名思义就是:递过去,归回来.所以我索性叫它做有借有还吧. 下面的例子由c而来: public class Main {                                public static void main(String[] args) {                                      fun(1);                                }                                publ