洛谷P1077 - 摆花 - DP
洛谷P1077 - 摆花
题目描述
小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共 m 盆。通过调查顾客的喜好,小明列出了顾客最喜欢的 n 种花,从 1 到 n 标号。为了在门口展出更多种花,规定第 ii种花不能超过 ai 盆,摆花时同一种花放在一起,且不同种类的花需按标号的从小到大的顺序依次摆列。
试编程计算,一共有多少种不同的摆花方案。
输入格式
第一行包含两个正整数 n 和 m,中间用一个空格隔开。
第二行有 n 个整数,每两个整数之间用一个空格隔开,依次表示 a1,a2,⋯,an。
输出格式
一个整数,表示有多少种方案。注意:因为方案数可能很多,请输出方案数对 10^6+7 取模的结果。
思路分析:动态规划问题,用dp[i][j]表示方案数,i表示总共有i种花时,j表示总共放了j盆
dp[0][0]=1
dp[i][j] = dp[i][j]+dp[i-1][j-k] //k表示第i种花可以放k盆
package dp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
/**
*
* 思路分析:动态规划问题,用dp[i][j]表示方案数,i表示总共有i种花时,j表示总共放了j盆
* dp[0][0]=1
* dp[i][j] = dp[i][j]+dp[i-1][j-k] //k表示第i种花可以放k盆
* @author XA-GDD
*
*/
public class P1077_Flowers {
static int N,M;
static int [] a = new int[1001];
static int [][] dp=new int[1001][1001];
static final int MOD = 1000007;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
for(int i=1;i<=N;i++) {
a[i] = Integer.parseInt(st.nextToken());
}
dp[0][0]=1;
for(int i=1;i<=N;i++) {
for(int j=0;j<=M;j++) {
for(int k=0;k<=a[i];k++) {
if(j>=k) {
dp[i][j] = (dp[i][j]+dp[i-1][j-k])%MOD;
}
}
}
}
System.out.println(dp[N][M]);
}
}
浙公网安备 33010602011771号