题意:实际上就是将n拆分成m个数,不计顺序,且不允许为空,求总数。

题解:dp[i][j]代表将j分成i份的种数(i>j时为0),那么dp[i][j]=dp[i-1][j-1]+dp[i][j-i],即分为两类,一类必须含有1,一类不含1。

View Code
 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 }