小蓝正在参与一个现场问答的节目。活动中一共有 30 道题目,每题只有答对和答错两种情况,每答对一题得 10 分,答错一题分数归零。
小蓝可以在任意时刻结束答题并获得目前分数对应的奖项,之后不能再答任何题目。最高奖项需要 100分,所以到达 100 分时小蓝会直接停止答题。
已知小蓝最终实际获得了 70分对应的奖项,请问小蓝所有可能的答题情况有多少种?
暴力解法:
import java.util.Scanner;
public class Main{
static int count = 0;
public static void main(String[] args) {
dfs(0,0);
System.out.print(count);
}
public static void dfs(int n,int score) {
if(n == 31) return ;
if(score == 100) return;
if(score == 70) count++;
//分治递归
dfs(n + 1,score + 10);//答对
dfs(n + 1,0);//答错
}
}
动态规划:
public class Main{
public static void main(String[] args) {
int[][] dp = new int[31][101];
//dp[i][j]表示在第i题时得到j分的方案种数
dp[0][0] = 1;
for(int i = 1;i < 31;i++) {
for(int j = 0;j < 101;j += 10) {
if(j != 100)//100分后直接结束,不会再往下答
dp[i][0] += dp[i - 1][j];//第i题答错
if(j != 0)//避免下标出界
dp[i][j] = dp[i - 1][j - 10];//第i题答对
}
}
int count = 0;
for(int i = 1;i < 31;i++) {
count += dp[i][70];
}
System.out.print(count);
}
}