题目链接:
说明:
虽然这道题并不是很难,思维上也不是特别难,数据小直接暴力就可以得到。但是还是需要注意一些细节,比如DFS的递归终止的条件的处理,当K>7的时候就要返回了,不然会继续向下递归,如果要三个条件同时成立才返回,那就会一直递归下去了,答案也不对。
另外是双重循环的模拟其实会有点难想,一开始还考虑会不会重复,但是仔细一想每个k,i,j的每个合法组合肯定是不会重复的。
代码:
cpp
#include<bits/stdc++.h>
#define int long long
const int N=1e3+10;
using namespace std;
int ans=0;
void dfs(int k,int s1,int s2){
if(k>7){//不能把三个条件写在一起判断,因为>7是返回的条件,三者满足是方案数目加一的条件
if(!s1&&!s2)
ans++;
return;
}
for(int i=0;i<=s1;i++){
//已经大于5时不再继续分
if(i>5) break;
for(int j=0;j<=s2;j++){
if(i+j>5) break;
if(i+j<2) continue;
// if((i+j)>=2&&(i+j)<=5)
dfs(k+1,s1-i,s2-j);
}
}
}
void solve(){
dfs(1,9,16);
}
signed main() {
cin.tie(0);
cout.tie(0);
solve();
cout<<ans;
return 0;
}