5-3 天然數的拆分 (20 分)

任何一個大於1的天然數n,總能夠拆分紅若干個小於n的天然數之和。 當n=7共14種拆分方法:java

7=1+1+1+1+1+1+1算法

7=1+1+1+1+1+2code

7=1+1+1+1+3字符串

7=1+1+1+2+2string

7=1+1+1+4it

7=1+1+2+3io

7=1+1+5class

7=1+2+2+2import

7=1+2+4方法

7=1+3+3

7=1+6

7=2+2+3

7=2+5

7=3+4

輸入格式:

輸入n, 1<n<20。

輸出格式:

按字典序輸出具體的方案。

輸入樣例:

在這裏給出一組輸入。例如:

7

輸出樣例:

7=1+1+1+1+1+1+1
7=1+1+1+1+1+2
7=1+1+1+1+3
7=1+1+1+2+2
7=1+1+1+4
7=1+1+2+3
7=1+1+5
7=1+2+2+2
7=1+2+4
7=1+3+3
7=1+6
7=2+2+3
7=2+5
7=3+4

 

這裏咱們一樣採用回溯法;每一個結點優先從1開始減去當前剩餘數,減數優先級遞減直到n-1結束;隨後判斷是否可減;當出現餘數既不爲0又小於當前減數時則判斷不可減,減去當前分支;具體算法以下:

package 宿題;
import java.io.*;

public class PTASplittingNumbers {
  static int A;
  public static void main(String args[])throws IOException{
    StreamTokenizer in=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
    in.nextToken();
    A=(int)in.nval;
    String s=""+A+"=";//初始化字符串s;
    Split(A,1,s);
  }

  private static void Split(int a,int n,String s){
    if(a==0){//當前餘數爲0,到達最底層;
      s=s.substring(0, s.length()-1);//將字符串最後一個字符「+」捨去;
      System.out.println(s);
    }else{
      for(int i=n;i<A;i++){
        if(a-i>=i||a-i==0)//判斷是否可減,不然剪枝;
          Cut(a-i,i,s+i+"+");
      }
    }
  }

 

該算法最壞狀況下的時間複雜度爲O((n-1)^n)。

}

相關文章
相關標籤/搜索