该题与郭炜讲的放平果原理一致(若下次所遇有顺序不同即“空盘不同”只需在递归的每步上乘上顺序即可),至于如何相出这个方法这个思维逻辑的,我想大抵是——“正向拆分”不行时就“反向集合”。
一般很可能会试着先全在一堆然后拿一个出去然后再拿一个出去,但很明显该方法不足以解出“n个一样的苹果放在n个一样的盘子有多少种放法”的。
#include <iostream>
using namespace std;
int a[51][51] = {0};//动归的储存
int NumDevide (int n , int wei);
int main(){
int n;
while(scanf("%d" , &n) != EOF){
int sum = NumDevide(n , n);
printf("%d\n" , sum);
}
return 0;
}
int NumDevide (int n ,int wei){
int num = 0;
int flag;
if(n == 0){
num = 1;
a[n][wei] = 1;
}else if(wei == 1){
num = 1;
a[n][wei] = 0;
}else if(n >= wei){
if(a[n-wei][wei] == 0){
a[n-wei][wei] = NumDevide(n-wei ,wei);
flag = a[n-wei][wei];
}
if(a[n][wei-1] == 0){
a[n][wei-1] = NumDevide(n , wei-1);
flag = a[n][wei-1];
}
num = a[n-wei][wei] + a[n][wei-1];
}else if(n < wei){
if(a[n][n] == 0){
a[n][n] = NumDevide(n, n);
}
num = a[n][n];
}
return num;
}