題目:
給定一個正整數n,求一共有多少種方式將它寫成若干個正整數之和。
例如:n=4,則輸出5.因為4只有如下五種求和方式:4 = 44 = 3 + 14 = 2 + 24 = 2 + 1 + 14 = 1 + 1 + 1 + 1
第一種方法,簡單遞歸。n的拆分,太復雜,但是如果我們限制了最多拆成幾個整數之和,就簡單些例如拆成一個整數:4 = 4 一種拆成兩個整數:4 = 3 + 1;4 = 2 + 2 兩種……
遞歸(記憶化):
import java.util.Scanner;public class 整數拆分1 { static int[][] data; static int p(int n, int m){ System.out.PRintln(n+"+"+m); if(n<m)return 0; if(n==1||m==1||n==m) return 1; if(n>m){ if(data[n][m]==-1) data[n][m]=p(n-1,m-1)+p(n-m,m); return data[n][m]; } return 0; } public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); data=new int[n+1][n+1]; for (int i = 0; i < n+1; i++) { for (int j = 0; j < n+1; j++) { data[i][j]=-1; } } int result = 0; for(int i=1; i<=n; i++){ result += p(n, i); } System.out.println(result); }}動態規劃:import java.util.Scanner;public class 數的拆分dp { static int[][] dp; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); dp=new int[n+1][n+1]; for (int i = 1; i < n+1; i++) { dp[i][1]=1; dp[i][i]=1; for (int j = 1; j < n+1; j++) { if(i>j){ dp[i][j]=dp[i-1][j-1]+dp[i-j][j]; } } for (int j = 1; j < i+1; j++) { dp[i][n]+=dp[i][j]; } //打表 for (int j = 0; j < n+1; j++) { System.out.print(dp[i][j]+","); } System.out.println(); } System.out.println(dp[n][n]/2); }}
新聞熱點
疑難解答