递归法:整数划分问题

问题:整数划分问题
例如,正整数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);
}
}

在这里插入图片描述

发布了65 篇原创文章 · 获赞 4 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/gl620321/article/details/104302946