问题:整数划分问题
例如,正整数6有如下11种划分:
6;
5+1;
4+2,4+1+1;
3+3,3+2+1,3+1+1+1;
2+2+2,2+2+1+1,2+1+1+1+1;
1+1+1+1+1+1;
代码:
package zhf;
public class Zhf {
public static void f(int n,int[] a,int k) { //数组a用来存放分解之后的元素,k为当前考虑的位置
//for(int i=1;i<n;i++) //i最小分割为1,最大为n-1;//例如:5 进行分割后为1,2,3,4
//要求从大到小:把5存入数组
//for(int i=n-1;i>0;i--) { //i最大被分割为n-1,此时无法写出终止条件,修改
if(n<=0) { //不需要分解
for(int i=0;i<k;i++)
System.out.print(a[i]+"+");
System.out.println();
return;
}
for(int i=n;i>0;i--) { //假设自身也是一种分解
//为防止出现1+1+2+2和2+1+2+1重复,假设已有前一项,则再不能重复,要比前一项小
if(k>0 && a[k-1]>i) //假如已有前一项K>0,且前一项k-1与i相比大于i;因为后一项不允许小于前一项,
continue; //会被其他排列覆盖
a[k]=i; //把最大的数在这里假设是5存入数组
f(n-i,a,k+1); //进行递归,i越来越小,分解结束,当n-i等于1的时候结束程序
}
}
public static void main(String[] args) {
int[] a=new int [1000]; //假设可能有1000中划分方法 例如:n的话有n个1相加
f(6,a,0);
}
}