- 题目
- 思路:
- 1.我们根据题目可以发现,题目要求我们数字相同,无论什么排序结果都定义为1种答案。
- 2.排序方案:1.1.5;1.2.4;1.3.3;2.2.3;观察这些排序方案我们会发现,分为选择1和不选择1。两种大方向。
- 3.选择1;那么对于(7,3)来说。就是这三份当中一定存在一份=1;那么我们可以理解为:(7-1,3-1);这样我们从总数抽出来一个1并且放入其中1份当中去。
- 4.不选择1;我们的方案中不存在1这个数据。我们可以(7-3,3);为什么这样操作?总数-份数,那么平摊下来一份就得到了一个1。(4,3)划分:1.1.2;可是在加上我们每一份减去的1。这样划分的每一位都不可能为1。
- 也会存在特例:1.n=0 或者 k=0 或者 n<k。return 0;这些情况中的某一个都无法进行划分。2.n=1或者n=k。return 1;如:(1,1)
- 对于这个题不需要去列举。化繁为简!!直接去调用:0和1的情况。也就是递归。
- 思维导图:
- PS:题目中表示,每一份不可以为空。
- 代码:
#include <stdio.h> #include <stdlib.h> int fn(int n,int k){ if(n==0 || k==0 ||n<k){ return 0; }else if(n==1 || n==k){ return 1; }else{ return fn(n-k,k)+fn(n-1,k-1); } } int main(){ int n,k; scanf("%d%d",&n,&k); int ans=fn(n,k); printf("%d",ans); return 0; }