题目大意:有n种花,每种花都有它自己的数量a[i],现在要求将这些花按照编号从小到大排成m盆花的方案数。
题目数据规模很大而且最后答案要求取模,很明显需要用递推算法求解。递推算法求解有三步。
一、设状态函数,本题问的是用前n种花摆m盆的方案数。故设f(i,j)=用前i种花摆前j盆的方案数,最后的答案就是d[n][m]。
二、状态转移方程(递推方程)
分析摆第i种花的时候,有min(a[i],j)种选择:不放、放一盆、放两盆、.......、放min(a[i],j)盆
对应第i-1种花的状态是f(i-1,j)、f(i-1,j-1)、f(i-1,j-2)、.......、f(i-1,j-min(a[i],j))
也就是达到第i种花的状态需要从第i-1种花的状态推出,由加法原理f(i,j)=f(i-1,j)+f(i-1,j-1)+f(i-1,j-2)+.......+f(i-1,j-min(a[i],j))
三、边界分析
f(i,0)=1,其余为0
因为论用多少种花摆0盆都只有一种方案——不摆
代码实现时,还需要注意j应该大于等于a[i]的前缀和,因为否则无论如何都不能摆出j盆花。
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cstdlib>
#include<cstring>
#define maxn 105
#define mo 1000007
using nam