暴力/动态规划--有奖问答

小蓝正在参与一个现场问答的节目。活动中一共有 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);
	}
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值