组合数学问题在信息学竞赛中的应用
组合数学是一个很灵活的东西,它需要一定的训练量和思路。
第一种题型
我们需要把题目所求的推出一个式子,然后用代码去实现。
第二种题型
我们不一定能有一个式子,但我们可以找到一个递推式一样的东西。
比如
这算是一种模型,一些细节的变化可能会在与盘子和苹果相不相同上。
我们在做这种题目的时候,往往采取递归的方法,分两种情况进行思考。一种是苹果数量多与盘子数量,考虑放弃一个盘子,或者每个盘子放一个苹果。
另一种是苹果数量n少于盘子数量m,其实最多只有苹果个数量的盘子起了作用,那么就递归(n,m),最后设置边界条件。
int solve(int n,int m){
if(m==0) return 0;
if(n==0||m==1||n==1) return 1;
if(n<m){
return solve(n,n);
}
else{//n>m
return solve(n-m,m)+solve(n,m-1);
}
}