题目描述
小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆。通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号。为了在门口展出更多种花,规定第i种花不能超过a_i盆,摆花时同一种花放在一起,且不同种类的花需按标号的从小到大的顺序依次摆列。
试编程计算,一共有多少种不同的摆花方案。
输入格式
第一行包含两个正整数n和m,中间用一个空格隔开。
第二行有n个整数,每两个整数之间用一个空格隔开,依次表示a_1,a_2,…,a_n。
输出格式
一个整数,表示有多少种方案。注意:因为方案数可能很多,请输出方案数对10000071000007取模的结果。
输入输出样例
说明/提示
【数据范围】
对于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 普及组 第三题
#include <bits/stdc++.h>
using namespace std;
const int N = 100, M = 100;
int n, m;
int a[N + 1];
int f[N + 1][M + 1];
int main()
{
cin >> n >> m;
for(int i = 1; i <= n; i++)
{
cin >> a[i];
}
f[0][0] = 1;
for(int i = 1; i <= n; i++)
{
for(int j = 0; j <= m; j++)
{
f[i][j] += f[i - 1][j];
for(int k = 1; k <= a[i]; k++)
{
if(j >= k)
{
f[i][j] += f[i - 1][j - k];
}
}
f[i][j] = f[i][j] % 1000007;
}
}
cout << f[n][m];
return 0;
}