题目
递推式为:
if(j >a[i] )
dp[i+1][j] = (dp[i][j] + dp[i+1][j-1] - dp[i][j-1-a[i]] +M)%M;
else{
dp[i+1][j] = dp[i][j] + dp[i+1][j-1];
代码如下
package day06;
import java.util.Arrays;
public class 多重集组合数 {
public static void main(String[] args) {
int n = 3;
int m = 3;
int[] a = {1,2,3};
int M = 1000;
int pailie = getPailie(n, m, a, M);
System.out.println(pailie);
}
public static int getPailie(int n,int m ,int[] a,int M){
int[][] dp = new int[n+1][m+1];
for (int i = 0; i <=n; i++) {
dp[i][0] = 1;
}
for (int i = 0; i < n; i++) {
for (int j = 1; j <=m ; j++) {
if(j-1-a[i]>=0){
//在有取余的情况下,要避免减法运算的结果出现负数
dp[i+1][j] = (dp[i+1][j-1]+dp[i][j]-dp[i][j-1-a[i]]+M)%M;
}else{
dp[i+1][j] = (dp[i+1][j-1]+dp[i][j])%M;
}
}
}
for (int i = 0; i < dp.length; i++) {
System.out.println(Arrays.toString(dp[i]));
}
return dp[n][m];
}
}