P2404 自然数的拆分问题
题目描述
任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和。现在给你一个自然数n,要求你求出n的拆分成一些数字的和。每个拆分后的序列中的数字从小到大排序。然后你需要输出这些序列,其中字典序小的序列需要优先输出。
输入格式
输入:待拆分的自然数n。
输出格式
输出:若干数的加法式子。
输入输出样例
输入 #1
7
输出 #1
1+1+1+1+1+1+1 1+1+1+1+1+2 1+1+1+1+3 1+1+1+2+2 1+1+1+4 1+1+2+3 1+1+5 1+2+2+2 1+2+4 1+3+3 1+6 2+2+3 2+5 3+4
说明/提示
用回溯做。。。。
n≤8
思路:题目已经暗示回溯了,那我们只需要整好回溯终止的条件就Ok
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
int[]a = new int[100];
List<String>ans = new ArrayList<String>();
public List<String> slove(int n) {
search(n, 0);
return ans;
}
public void search(int remain, int step) {
if(remain == 0 && step != 1) {
String s = new String();
for(int i = 0; i < step; i++) {
if(i != 0)s = s + "+";
s = s + a[i];
}
ans.add(s);
return;
}
for(int i = 1; i <= remain; i++) {
if((step == 0||i >= a[step - 1]) && i <= remain) {
remain -= i;
a[step] = i;
step++;
search(remain, step);
step--;
remain += i;
}
}
}
public static void main(String[] args) {
// TODO Auto-ge nerated method stub
Scanner in = new Scanner(System.in);
int n = in.nextInt();
List<String>res = new Main().slove(n);
for(String s:res) {
System.out.println(s);
}
}
}