复盘一下之前的笔试做的题目,这是第一题,100分的题目。考的回溯,当时也没做出来。
1.新员工考试
小聪入职新公司,参加线上的新员工必备考试,考试共25题,以此是10个判断题(每题2分)、10个单选题(每题4分)和5个多选题(每题8分),总分100分。
考题只能顺序作答,答对题目获得相应分数,答错题目获得0分,考试系统不提示作答是否正确,答题过程中如果累积有3题答错,直接中止考试并计算考试分数。
小聪考试结果是N分(0<=N<=100),请根据小聪的分数,算出所有可能的答题情况的个数。
输入
整数,表示小聪的考试得分N,N为偶数,0<=N<=100(N不会是不可能考出来的分数)。
输出
整数 表示所有可能的答题情况的个数
样例1
输入:
94
输出:
100
解释:
有1道判断题和1道单选题答错,其余的题目都答对,所有可能的答题情况的个数为100。
样例2
输入:
100
输出:
1
解释:
所有题目全部答对,答错情况的个数为1。
思路:
回溯,进行模拟来枚举所有的情况,设置一个函数dfs(),order表示当前答的题号,初始化得分为0,对于每个题目,都有答对或者答错两种可能,依次进行判断。到指定的分数就对情况数+1。
附上Java代码实现:
import java.util.*;
public class Solution1 {
public static int res = 0;
public static void dfs(int sumScore,int order, int wrongNum,int target){
//回溯所有情况
if(sumScore==target){
res++;
return;
}
//答错三道或者答完所有题目,退出
if(wrongNum>=3 || order>25){
return;
}
//判断题
if(order<=10){
//此题答对
dfs(sumScore+2,order+1,wrongNum,target);
//此题答错
dfs(sumScore,order+1,wrongNum+1,target);
//单选题
}else if(order<=20){
//此题答对
dfs(sumScore+4,order+1,wrongNum,target);
//此题答错
dfs(sumScore,order+1,wrongNum+1,target);
}
//多选题
else {
//此题答对
dfs(sumScore+8,order+1,wrongNum,target);
//此题答错
dfs(sumScore,order+1,wrongNum+1,target);
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int target = sc.nextInt();
//从第一题开始答
dfs(0,1,0,target);
System.out.println(res);
}
}