洛谷 P1025 【数的划分】

进入正题

思路:递归

这道题有点像放苹果:

把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分发(5,1,1和1,1,5是同一种方法)

转化一下就有:
把n个苹果放在k个盘子里,每个盘子都不空.

那么这样就好理解,可以先把每一个盘子都放上苹果,注意是每一个盘子,所以开始递归时从(n - k)开始,盘子数还是k;

接下来就是递归里面了

1.如果苹果为0,那么就返回1,就算上一次的方案完成,有了1个方案;

2.如果只有一个盘子了,那么肯定把剩下所有的都放进去,所有又1个方案;

3.如果没盘子了那还放个** , 只能返回0;

4.如果苹果还没盘子多,其余的盘子就可以直接砸了不放了,盘子递归苹果 数就ok了;

5.如果以上都不满足那么就可以考虑两种递归:

  A.少一个盘子,苹果数不变
  B.所有盘子都放一个,盘子数不变,苹果减少

献上代码

#include <bits/stdc++.h>
using namespace std;
int n , k;
int g(int x , int y){
	if(x == 0) return 1;
	if(y == 1) return 1;
	if(y == 0) return 0;
	if(x < y) return g(x , x);
	return g(x - y , y) + g(x , y - 1); 
}
int main(){
	cin >> n >> k;
	cout << g(n - k , k);
	return 0;
}
posted @ 2020-06-15 17:15  那一条变阻器  阅读(79)  评论(0编辑  收藏  举报