很好玩的一个问题。话说小明的苹果怎么可能一模一样?
显然这并不是重点。重点在于抽象这个问题的方法。
如果从M个苹果,拿出N个苹果,问有几种可能性,很明显这是典型的组合问题;
如果把M个苹果等分成N份。显然只有1种可能。
把苹果分成N堆,求可能性,我一时半会想不出什么数学模型。自然而然,想到了数学方法:迭代逼近和递归。
题目额外说明,1,3,1 和1,1,3算同一种分法。其分发可能等价于将苹果递减或者递增排列。
于是我们开始递归计数:
递归操作:遍历M~0,如果存在M比数组之前的元素小,说明这是递减情况下的最大可能,就给新的元素赋值M,并且为剩下的元素进行递归操作。
递归退出条件: 数组最后一位也完成赋值(剩下的元素正好小于等于之前的数)。
递归退出操作: 计数器加一。如果愿意,可以输出此时的数组。
C++ 实现算法(值得我自己练习和细品)#include "stdafx.h"
#include
int Count = 0;
using namespace std;
void printArr(int dishNum, int* arr){
for (int i = 0; i
for (int j = 0; j
cout <
cout <
}
cout <
}
void allocation(int