新员工考试_A卷_100分_回溯/递归/dfs

新员工考试

题目描述:

  小聪入职新公司,参加线上的新员工必考试共25题,依次是10个判断题(每题2分)、10个单选题(每题4分)和5个多选题(每题8分),总分100分。
  考题只能顺序作答,答对题目获得相应的分数,答错题目获得0分,考试系统不提示作答是否正确,答题过程中如果累积有3题答错,直接中断考试并计算考试分数。
  小聪考试结果是N分(0<=N<=100),请根据小聪的分数,算出所有可能的答题情况的个数。

输入输出描述:

输入描述:

  一个整数,表示小聪的考试得分N,N为偶数,0<=N<=100,N不会是不可能考出来的分数。

输出描述:

  一个整数,表示所有可能的答题情况的个数。

示例1:

输入:
	94
输出:
	100
解释:
	有1道单选和一道判断题答错,其余题都对,所有可能的答题情况的个数为100。

示例2

输入:
	100
输出:
	1
解释:
	所有题都对,答题情况的个数为1。

解题思路:

回溯的思想,使用递归来实现:
dfs(int target, int i, int wrong) : target目标分数,i表示马上要回答的题目编号,wrong表示已经答错的错误个数
1、明确递归基:
  ①如果目标分数已经为0,则结束递归,“归”
  ②如果答完25道题目,或者错题数达到3,代表没有能达到目标分数,或者结束考试,返回
2、递归:根据题目数量确定题目类型,从而确定题目得分,选择答对或者答错两种方案,看最终是否能够得到目标分数

代码:

static int ans = 0;
public static void main(String[] args) {
	Scanner scanner = new Scanner(System.in);
	int n = scanner.nextInt();

	// 1表示马上要回答的题目,0表示错误的个数
	dfs(n, 1, 0);
	System.out.println(ans);
}

/**
 * 已经回答了 i - 1 题目,现在作答 第i道
 * @param target 目标分数
 * @param i 第i道题目
 * @param wrong 已经答错的数量
 */
private static void dfs(int target, int i, int wrong) {
	// 如果目标分数已经为0,则 归
	if (target == 0) {
		// 又有一种方案可以得到目标分数,方案总数++
		ans++;
		return;
	}

	// 如果答完25道题目,或者错题数达到3,结束考试
	if (i > 25 || wrong >= 3) {
		return;
	}

	if (i <= 10) {
		// 选择题:本题答对
		dfs(target - 2, i + 1, wrong);
		// 选择题:本题答错
		dfs(target, i + 1, wrong + 1);
	} else if (i <= 20) {
		// 判断题:本题答对
		dfs(target - 4, i + 1, wrong);
		// 判断题:本题答错
		dfs(target, i + 1, wrong + 1);
	} else {
		// 多选题:本题答对
		dfs(target - 8, i + 1, wrong);
		// 多选题:本题答错
		dfs(target, i + 1, wrong + 1);
	}
}

回溯/递归相关题目

等和子数组最小和
无向图染色
最大岛屿体积
羊、狼、农夫过河
考古学家
叠积木
用户调度问题
报文解压缩
机器人走迷宫
迷宫问题
仿 LISP 运算
全排列
最大时间
最大平分数组
星际篮球争霸赛

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值