献丑了。。不知道对不对,dp问题,dp[i][j]表示0-i个袋子装j个球的放法数public class BallInPackage {public int ballInPackage(int numsOfBags, int numsOfBalls) { int[][] dp = new int[numsOfBags][numsOfBalls + 1]; //initialization for(int i = 0; i < numsOfBags; i++) dp[i][0] = 1; for(int i = 1; i <= numsOfBalls; i++) dp[0][i] = 1; //calculate the dp matrix for(int i = 1; i < numsOfBags; i++) { for(int j = 1; j <= numsOfBalls; j++) { int nums = 0; for(int k = 0; k <= j; k++) nums += dp[i-1][k]; dp[i][j] = nums; } } return dp[numsOfBags-1][numsOfBalls]; } public int ballInPackage_Advanced(int numsOfBags, int numsOfBalls) { int[][] dp = new int[numsOfBags][numsOfBalls + 1]; //initialization for(int i = 0; i < numsOfBags; i++) dp[i][0] = 1; dp[0][2] = 1; dp[0][3] = 1; //calculate the dp matrix for(int i = 1; i < numsOfBags; i++) { for(int j = 1; j <= numsOfBalls; j++) { if(j < 2) dp[i][j] += dp[i-1][j]; else if(j == 2) dp[i][j] += dp[i-1][j] + dp[i-1][j-2]; else if(j >= 3) dp[i][j] += dp[i-1][j] + dp[i-1][j-2] + dp[i-1][j-3]; else dp[i][j] = 0; } } return dp[numsOfBags-1][numsOfBalls]; } public static void main(String[] args) { BallInPackage b = new BallInPackage(); System.out.println(b.ballInPackage(12, 20)); System.out.println(b.ballInPackage_Advanced(12, 20)); } }