【NOIP2012普及组】摆花 (递推)

来源:互联网 发布:万国数据官网 编辑:程序博客网 时间:2024/05/17 02:12

题目

这是一道递推的题,f(i,j)前i种花放前j个位置。
f(i,j)=f(i-1,j)+f(i-1,j-1)……..+f(i-1,j-min(a[i],j)).
其实就是枚举现在第i种花放几盆,最多能放min(a[i],j)盆。然后剩下的放前i-1种花。有了递推方程,剩下的就是填表了。
详细代码如下:

#include<cstdio>#include<cstdlib>#include<iostream>using namespace std;const int maxn=105;const int mod=1000007;int a[maxn],n,m,d[maxn][maxn]={0};void work(){    d[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<=j;k++)    {        d[i][j]=(d[i][j]+d[i-1][j-k])%mod;    }    cout<<d[n][m];}int main(){    //freopen("flower.in","r",stdin);    //freopen("flower.out","w",stdout);    scanf("%d%d",&n,&m);    for(int i=1;i<=n;i++)    scanf("%d",&a[i]);    work();    return 0;}
1 0