新员工考试
题目描述:
小聪入职新公司,参加线上的新员工必考试共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 运算
全排列
最大时间
最大平分数组
星际篮球争霸赛