将一个数分解为由1和2组成的数组,并将这个数组的所有排列组合列出 一个是使用java写的动态 import java.util.ArrayList; import java.util.Scanner; public class robet { /** * @param args * this progrom is a method to resolve the problem of robet move * 还真是奇怪啊。 */ public static String result[]=new String[1024*1024]; public static int fab[]=new int[1024]; public static void init() { result[1]="1"; result[2]="11,2"; System.out.println(result[1].split(",")); } public static void get_result(int n) { if(n<3) { System.out.println("the result is :"); System.out.println(result[n]); return ; } for(int i=3;i<=n;i++) { result[i]=add_str(result[i-1].split(","),result[1].split(","))+ add_str(result[i-2].split(","),result[2].split(",")); result[i]=remove_same(result[i]); } System.out.println(result[n]); } public static int fab1(int n) { fab[0]=1; fab[1]=1; for(int i=2;i<n;i++) { fab[i]=fab[i-1]+fab[i-2]; } return fab[n-1]; } public static String remove_same(String str) { String[] s=str.split(","); ArrayList<String> list= new ArrayList<String>(); str=""; for(int i=0;i<s.length;i++) { if(list.contains(s[i])) continue; else list.add(s[i]); } for(int i=0;i<list.size();i++) { str+=list.get(i)+","; } return str; } public static String add_str(String[] one,String[] two) { int len1=one.length; int len2=two.length; String str=""; for(int i=0;i<len2;i++) { for(int j=0;j<len1;j++) { str+=two[i]+one[j]+","+one[j]+two[i]+","; } } return str; } public static void main(String[] args) { fab1(1024); init(); Scanner sc=new Scanner(System.in); int res=sc.nextInt(); get_result(res); String[] ss= result[res].split(","); System.out.println(ss.length); } } 复杂无比,我不得不这么说 一个用c++写的回溯,形式很简单。 #include <vector> #include <iostream> using namespace std; vector<int> vec; void f(int sum, int sub) { vec.push_back(sub); sum -= sub; if(sum <= 0) { for(int i = 0; i < (int)vec.size(); i++) cout << vec[i] << " "; cout << endl; return ; } int temp = sum; vector<int> tvec(vec); if(sum > 0) f(sum,1); vec = tvec; sum = temp; if(sum > 1) f(sum,2); } int main() { int n; cin >> n; int temp = n; vector<int> tvec(vec); if(n > 0) f(n,1); vec = tvec; n = temp; if(n > 1) f(n,2); return 0; } 书上总说回溯和递归之类的形式上简单,效率较为低下,感觉很无语