数的划分与放苹果问题

Posted shuaihui

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数的划分与放苹果问题相关的知识,希望对你有一定的参考价值。

将整数n分成k份,且每份不能为空,任意两种划分方案不能相同(不考虑顺序)。
例如:n=7,k=3,下面三种划分方案被认为是相同的。
1 1 5

1 5 1

5 1 1
问有多少种不同的分法。

 

* 本题类似n个苹果放入m个盘子中

* 此基础上加入盘子不能为空

 

* 思路: 

* m个苹果放在n个盘子中,那么定义函数为apple(m,n):

* 1.m=0,没有苹果,那么只有一种放法,即apple(0,n)=1

* 2.n=1,只有一个盘中,不论有或者无苹果,那么只有一种放法,apple(m,1)=1

* 3.n>m,和m个苹果放在m个盘子中是一样的,即apple(m,n)=apple(m,m)

* 4.m>=n,这时分为两种情况: 

* 一、所有盘子都有苹果。 

* 二、不是所有盘子都有苹果。

* 不是所有盘子都有苹果和至少有一个盘子空着是一样的,即=apple(m,n-1)。

* 所有盘子都有苹果,也就是至少每个盘子有一个苹果,

* m个苹果中的n个放在n个盘子中,剩下的m-n个苹果,

* 这和m-n个苹果放在n个盘子中是是一样的,即=apple(m-n, n)。

* 这时,apple(m,n)=apple(m-n, n)+apple(m,n-1)。

 

技术分享图片
#include <cstdio>

#include <iostream>

using namespace std; 

 

int n, k;



//a个苹果放入b个盘子中 

int dfs(int a, int b)

{

//没有苹果 和 只有一个盘子 

if(a == 0 || b == 1) 

return 1;

else if(a < b)  //苹果数 < 盘子数 等价于 苹果数 == 盘子数

return dfs(a, a);

else     //(无空盘)先b果放b盘,再a-b果放b盘 +  (至少有1个空盘)a果放b-1盘 

return dfs(a-b, b) + dfs(a, b-1); 

}



int main()

{

cin>>n>>k;

cout<<dfs(n-k, k);  //先每个盘子放个苹果 就保证盘子不为空 

return 0;

} 
View Code

 




以上是关于数的划分与放苹果问题的主要内容,如果未能解决你的问题,请参考以下文章

8787:数的划分(又是一个放苹果)

[LuoguP1025][数据加强]数的划分

验证码的旋转与放缩代码

noi 8787 数的划分

如何使用 xcode 将快照划分为多个片段,以便让用户与每个片段进行交互?

2021-12-24:划分字母区间。 字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。 力扣763。某大厂面试