洛谷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]); } }
标签:摆花,洛谷,int,static,种花,StringTokenizer,P1077,new,dp 来源: https://www.cnblogs.com/smile_to_warm/p/15103794.html