题意:实际上就是将n拆分成m个数,不计顺序,且不允许为空,求总数。
题解:dp[i][j]代表将j分成i份的种数(i>j时为0),那么dp[i][j]=dp[i-1][j-1]+dp[i][j-i],即分为两类,一类必须含有1,一类不含1。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 import java.math.*; 2 import java.util.Scanner; 3 class Main{ 4 static BigInteger dp[][]=new BigInteger[205][205]; 5 public static void main(String[] args) { 6 Scanner cin = new Scanner(System.in); 7 dp[0][0]=BigInteger.ONE; 8 for(int i=1;i<=200;i++) 9 dp[0][i]=BigInteger.ZERO; 10 for(int i=1;i<=200;i++) 11 { 12 for(int j=0;j<i;j++) 13 dp[i][j]=BigInteger.ZERO; 14 for(int j=i;j<=200;j++) 15 dp[i][j]=dp[i-1][j-1].add(dp[i][j-i]); 16 } 17 while(true) 18 { 19 int n,k; 20 n=cin.nextInt(); 21 k=cin.nextInt(); 22 if(n==0&&k==0) 23 break; 24 else 25 System.out.println(dp[k][n]); 26 } 27 } 28 }