整數劃分
f(n,m)表示將整數n劃分最大值不超過m的等式個數
則
n=1或者m=1時,f(n,m)=1 ,n=1時只能有一種(1),m=1時,只能有(1,1,...1)這一種。
當n=m時,f(n,m)=f(n,n-1)+1,即爲(n)加上劃分爲最大值不超過n-1的個數。
當m>n時,f(n,m)=f(n,n),m不可能最大劃分值大於n.
當m<n時,f(n,m)=f(n-m,m)+f(n,m-1),第一中情況劃分一定包含m,剩下n-m繼續劃分劃分。
第二中情況不包含m,即所有的劃分值比m小f,即f(n,m-1)
注意:動態規劃,劃分的子問題往往不是相互獨立的,所以要將子問題的答案保存起來。
import java.util.Scanner; public class Main_1028 { private static int count = 0; private static int[][] memo = new int[121][121]; public static void main(String[] args) { Scanner in = new Scanner(System.in); while(in.hasNext()){ int n = in.nextInt(); count = 0; System.out.println(getEquation(n,n)); } } public static int getEquation(int n,int m){ if(memo[n][m]!=0){ return memo[n][m]; } if(n < 1 || m < 1){ return 0; } if(n==1 || m==1){ return memo[n][m] = 1; } if(n > m) { return memo[n][m] = getEquation(n - m, m) + getEquation(n, m - 1); } if(n == m){ return memo[n][m] = getEquation(n,n-1)+1; } return memo[n][m] = getEquation(n,n); } }