/* 整数m分割为n个整数相加的分法问题,等价于解决m个苹果
* 放在n个相同的盒子里有几种分法的问题
* 如(1,2)和(2,1)是同一种分法
* */
public class IntegerPartitioning{
public static void main(String []args){
// 测试整数m分为n个整数相加,一共有多少种情况
int m = 3;
int n = 2;
int min = 0; // 分割后的整数的最小值
int max = 2; // max值不能大于m
int sum = 0; // 存放结果
sum = partition( m , n , min , max );
System.out.println("sum = " + sum);
}
public static int partition(int m, int n, int min, int max) {
// 迭代法处理分割,每种情况对应一种最小值为min的分割
// 控制迭代次数
if( m < min )
return 0;
if( n == 1 ){
if( m > max )
// 如果分割得到的数字大于max,此次分割失败
// 如果没有最大值限制,可以取消这句,直接返回1
return 0;
else
return 1;
}
int sum = 0;
for( int i = min; i <= max ; i++){
sum += partition( m-i , n - 1, i , max);
// 每个m-i值说明已分割了一个i值
}
return sum;
}
}