网易编程—工作安排

题目介绍:现在有n位工程师和6项工作(编号为0至5),现在给出每个人能够胜任的工作序号表(用一个字符串表示,比如:045,表示某位工程师能够胜任0号,4号,5号工作)。现在需要进行工作安排,每位工程师只能被安排到自己能够胜任的工作当中去,两位工程师不能安排到同一项工作当中去。如果两种工作安排中有一个人被安排在的工作序号不一样就被视为不同的工作安排,现在需要计算出有多少种不同工作安排计划。

笔试时候遇到这个问题,是一道动态规划的问题,当时并没有多少思路,做完后看了大神们的作法,是在觉得别人的想法很好,现在贴出一种解法,可以参考别人的代码,网上挺多的,介绍一下思路。

首先先将输入的数据压入容器中,并且定义一个1行10列的矩,当然具体这个矩阵多大与有几项工作相关,并且全置为1,表示所有工作都没有人占用。接着就可以调用函数。

dfs(0);

调用完这一行,程序就来到了关键的函数部分为下:

void dfs(int i)
{
	if (i == a.size()) 
	{
		ret++;
	}
	else
	{
		for (int j = 0; j < a[i].size(); j++)
		{
			if (b[a[i][j] - '0']) 
			{
				b[a[i][j] - '0'] = 0;
				dfs(i + 1);
				b[a[i][j] - '0'] = 1;
			}
		}
	}
}



首先可以看到最后输出的结果是ret,而且ret只有在i等于a的大小的时候才会加1,所以第一次传进来的时候i等于0,那么就循环第一个人会的所有技能,只要我找到了他会的某项技能在我初始初始化技能的矩阵中为1,那么就表示没有人占用这项工作,那么我就把对应工作置为0,当然这个人他只能占用一项工作,现在就开始递归函数,继续执行下一个人,又让他去占据一项没有人做的工作,如此执行,直到我们判断到最后一个人,那么就给情况数目加1.

由于是递归函数每一个函数执行到调用函数那一步,都还有大量的后续工作没有执行完,继续返回到执行的那一步,即返回到倒数第二人那里,让他之前占据的工作为1,那么对于倒数第二个人来说,他占用的工作变了,那么最后一个人占用的工作肯定也变了,这样那总数也就加1了,执行完在对倒数第二人执行这样的操作,直到循环到他会的最后一项技能,这个人执行完,那么就递归到上一个人,直到返回到第一个人结束,那最后输出的就是一共有多少种可能。

实在是觉得这种思想很巧妙,看来要学习的东西还很多很多,加油吧。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值