问题描述:
小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆。通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号。。weil在门口展出更多的花,规定第i种花不能超过ai盆,摆花时同一种花放在一起,且种类不同的花需要按标号的从小到大的顺序依次摆列。
试编程计算,一共有几种不同的摆花方案。
输入描述:
第一行包含两个整数n和m,中间用一个空格隔开。
第二行有n个整数,每两个整数之间用一个空格隔开,依次表示a1,a2,a3.......an。
其中,0<n<=100,0<m<=100,0<=ai<=100
输出描述:
输出只有一行,一个整数,表示有多少种方案。注意:因为方案数可能很多,请输出方案数对10^6+7取模的结果。
package lanqiao;
import java.util.Scanner;
/**
* 2023/12/1
* 一共有m盆花,需要摆上顾客喜欢的n种花,从1到n标号
* 规定第i种花不能超过ai盆,摆花时同一种花摆在一起
* 且不同种类的花要按照标号从小到大按顺序排列
* 问一共有多少种不同的摆花方案
*/
public class lanqiao389_摆花 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//在此输入您的代码...
int n=scan.nextInt();//标号
int m=scan.nextInt();//花盆总数
int[] a=new int[n+1];//第i种花不能摆超过ai盆
for(int i=1;i<=n;i++){//标号是从1开始的
a[i]=scan.nextInt();
}
int[][] dp=new int[n+1][m+1];//方案数
for(int i=0;i<=n;i++){
dp[i][0]=1;//如果第i种花一盆也不摆放,方案数为1
}
for(int i=1;i<=n;i++){//鲜花种类
for(int j=1;j<=m;j++){//摆放花盆总数
for(int k=0;k<=j&&k<=a[i];k++){//这一种花的摆放盆数
dp[i][j]+=dp[i-1][j-k];
dp[i][j]%=(int)1e6+7;
}
}
}
System.out.println("方案数为:"+dp[n][m]);
scan.close();
}
}
运行结果如下:
2 4
3 2
方案数为:2