题目链接:
2.分糖果 - 蓝桥云课 (lanqiao.cn)
说明:
虽然这道题并不是很难,思维上也不是特别难,数据小直接暴力就可以得到。但是还是需要注意一些细节,比如DFS的递归终止的条件的处理,当K>7的时候就要返回了,不然会继续向下递归,如果要三个条件同时成立才返回,那就会一直递归下去了,答案也不对。
另外是双重循环的模拟其实会有点难想,一开始还考虑会不会重复,但是仔细一想每个k,i,j的每个合法组合肯定是不会重复的。
代码:
#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;
}