目录
题目:
题目描述:
题目链接:
思路:
核心思路:
DFS
思路详解:
看题解这题可以用DFS和DP做,因为我DP学的不是很好,看见填空题不用考虑超时我第一思路就是暴力DFS,所以暂时就不补充DP的做法了
DFS传入的两个参数是现在在做第几道题和已经得到的分数,DFS递归就两种情况,这题答对或者这题答错。如果不进行任何剪枝跑出结果可能会要一点时间但是也不会特别久,建议还是把能够想到的剪枝条件加上提高运行效率
代码:
代码详解:
#include<bits/stdc++.h> //看题解这题可以用dfs或dp做
using namespace std; //因为是填空题不用考虑超时,首先考虑暴力做法dfs来做
int ans;
void dfs(int k,int score) //k表示第几道题,score表示得到的分数
{
if(score==100||k>=31) //由题一共30道题,只要拿到100分或答完就停止
{
return;
}
if(score>=80&&k>=25) //这两个if是两种绝对不可能有70分的情况,dfs剪枝优化时间
{
return;
}
if(score==0&&k>=25) //没有这两个剪枝运行时间大概在12s出答案,优化后运行时间只需要2s
{
return;
}
if(score==70) //如果得到70分就记录一次,但是不能退出,因为可能继续作答
{
ans++;
}
dfs(k+1,score+10); //答对的情况,递归到下一题
dfs(k+1,0); //答错的情况,递归到下一题
}
int main()
{
dfs(0,0);
cout<<ans<<endl;
return 0;
}