问题描述:
整数分划如,
对于正整数n=6,可以分划为:
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+1
现在的问题是,对于给定的正整数n,编写算法打印所有划分。用户从键盘输入 n (范围1~10),程序输出该整数的所有划分。
思路分析:
自上而下的思考问题,是不断的进行划分,画出其解答树,可以使用dfs穷尽所有情况,若剩余值为0,则直接输出字符串集合(递归出口),即可得出结果。
具体见代码注释:
import java.util.*;
public class Zshf
{
private static int n;
public static void main(String[] args)
{
LinkedList<String>str=new LinkedList<String>();
Scanner sc=new Scanner(System.in);//输入
n=sc.nextInt();
integerDivide(n,n,str);//求整数n的分划
}
private static void integerDivide(int num,int limit,LinkedList<String>str)//将 num进行最大数为limit的分划
{
if(0==num)//递归出口
{
print(str);//打印字符
return;
}
for(int i=limit;i>=1;--i)
{
if(i<=num)
{
str.add(String.valueOf(i));//将整数i转换成字符串,并加到链表尾部
integerDivide(num-i,i,str);//递归
str.removeLast();//回溯
}
}
}
private static void print(LinkedList<String> str)//字符打印函数
{
System.out.print(str.getFirst());
for(int i=1;i<str.size();i++)
{
System.out.print("+"+str.get(i));
}
if(str.size()+Integer.parseInt(str.getFirst())==n+1)
System.out.println();
else
System.out.print(',');
}
}
运行结果见下: