1、新员工考试
小聪入职新公司,参加线上的新员工必备考试,考试共25题,依次是10个判断题(每题2分)、10个单选题(每题4分)和5个多选题(每题8分),总分100分;
考题只能顺序作答,答对题目获得相应的分数。答错题目获得0分,考试系统不提示作答是否正确,答题过程中如果累积有3题答错,直接中止考试并计算考试分数。
小聪考试结果是N分,请根据小聪的分数,算出所有可能的答题情况的个数。输入一个整数,表示小聪的考试得分N,N为偶数,0<=N<=100(N不会是不可能考出来的分数)。
输出一个整数表示所有可能的答题情况的个数
样例1
输入:94
输出:100
解释:有1道判断题和1道单选题答错,其余的题都答对,所有可能的答题情况的个数为100;
样例2
输入:100
输出:1
解程:所有题目全部答对,答题情况的个致为1
package 面试题.华为;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
//1、新员工考试
//小聪入职新公司,参加线上的新员工必备考试,考试共25题,依次是10个判断题(每题2分)、10个单选题(每题4分)和5个多选题(每题8分),总分100分;
//考题只能顺序作答,答对题目获得相应的分数。答错题目获得0分,考试系统不提示作答是否正确,答题过程中如果累积有3题答错,直接中止考试并计算考试分数。
//小聪考试结果是N分,请根据小聪的分数,算出所有可能的答题情况的个数。输入一个整数,表示小聪的考试得分N,N为偶数,0<=N<=100(N不会是不可能考出来的分数)。
//输出一个整数表示所有可能的答题情况的个数
public class Score {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[] grade = new int[25];
for (int i = 0; i < 10; i++) {
grade[i] = 2;
}
for (int i = 10; i < 20; i++) {
grade[i] = 4;
}
for (int i = 20; i < 25; i++) {
grade[i] = 8;
}
int result=dfs(0,N,3,grade);
System.out.println(result);
}
//方法一:递归暴力搜索 每道题做对和做错两种情况去讨论 累计做错三次就终止
//index 0-24的题目题号 rest 凑分数时候剩下没凑的分数 count 当前累积错题数
/**
* @param index 题目的题号 从0开始到24
* @param rest 我们要凑的分数 刚开始是N
* @param count 错题数 初始为3
* @param grade 题目分数数组
* @return
*/
public static int dfs(int index, int rest, int count, int[] grade) {
//如果错题0道 且刚好分数凑够 (rest剩下要凑的分数为0) 则说明只有一种情况 满分
//若rest不是0,说明不存在这种情况 return 0即可
if (count == 0) {
return rest == 0 ? 1 : 0;
}
//若是分数凑够,rest=0,则只有一种情况 0分
if (rest == 0) {
return 1;
}
//防止数组越界
if (index >= grade.length) {
return 0;
}
//当前这道题做错的情况+做对的情况
return dfs(index + 1, rest, count - 1, grade)
+ dfs(index + 1, rest - grade[index], count, grade);
//index:无论错对index都得后移,做对得分,做错不得分
//rest:刚开始是N,我们现在进行凑分数,要是做错这道题不得分所以要凑的分数还是rest
//做对的话,就把获得的分数减去,得到重新要凑的分数rest
//count:我们刚开始假设做错了三道题,要是这道题做对则错题数减一;做错不变
}
}