摆花

题目描述

小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆。通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号。为了在门口展出更多种花,规定第i种花不能超过a_i盆,摆花时同一种花放在一起,且不同种类的花需按标号的从小到大的顺序依次摆列。

试编程计算,一共有多少种不同的摆花方案。

输入输出格式

输入格式:

第一行包含两个正整数n和m,中间用一个空格隔开。

第二行有n个整数,每两个整数之间用一个空格隔开,依次表示a_1,a_2,…,a_n

输出格式:

一个整数,表示有多少种方案。注意:因为方案数可能很多,请输出方案数对1000007取模的结果。

输入输出样例

输入样例#1: 
2 4
3 2
输出样例#1: 
2

说明

【数据范围】

对于20%数据,有0<n≤8,0<m≤8,0≤a_i≤8

对于50%数据,有0<n≤20,0<m≤20,0≤a_i≤20

对于100%数据,有0<n≤100,0<m≤100,0≤a_i≤100

NOIP 2012 普及组 第三题

分析

显然本题是一道DP,所以开始考虑状态转移方程,即:二维数组处理,表示放到第i种花已放了j盆花。

也就是:f[i][j+k]+=f[i-1][k];

CODE

 1 #include<cmath>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 using namespace std;
 7 const int mod=1000007;
 8 const int M=105;
 9 int n,m;
10 int a[M];
11 int f[M][M];
12 inline int get(){
13     char c=getchar();
14     int res=0;
15     while (c<'0'||c>'9') c=getchar();
16     while (c>='0'&&c<='9'){
17         res=(res<<3)+(res<<1)+c-'0';
18         c=getchar();
19     }
20     return res;
21 }
22 int main() {
23     n=get(),m=get();
24     for (int i=1;i<=n;i++) a[i]=get();
25     for (int i=0;i<=n;i++) f[i][0]=1;
26     for (int i=1;i<=n;i++){
27         for (int j=0;j<=a[i];j++){
28             for(int k=0;k<=m-j;k++){
29                 if(j==0&&k==0) continue;
30                 f[i][j+k]+=f[i-1][k];
31                 f[i][j+k]%=mod;
32             }
33         }
34     }
35     printf("%d",f[n][m]%mod);
36     system("pause");
37     return 0;
38 }
原文地址:https://www.cnblogs.com/kanchuang/p/11116115.html