数的划分与放苹果问题
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; }
以上是关于数的划分与放苹果问题的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 xcode 将快照划分为多个片段,以便让用户与每个片段进行交互?
2021-12-24:划分字母区间。 字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。 力扣763。某大厂面试