【动态规划】[NOIP2012]摆花

来源:互联网 发布:网络出租屋用什么网络 编辑:程序博客网 时间:2024/05/17 00:15

题目

动态规划
定义f[i][j]表示前i种花摆满j个花盆所得的方案数
f[i][j] = f[i][j] + f[i-1][j-min(a[i],j)

代码如下

#include<iostream>#include<cstdio>#include<cctype>    using namespace std;    #define in = read()    typedef long long ll;    const ll size = 500 + 10;        ll n,m;        ll a[size];        ll f[size][size]; inline ll read(){        ll num = 0 , f = 1;   char ch = getchar();        while(!isdigit(ch)){                if(ch == '-')   f = -1;                ch = getchar();        }        while(isdigit(ch)){                num = num*10 + ch - '0';                ch = getchar();        }        return num*f;}int main(){        n in;   m in;        for(int i=1;i<=n;i++)                 a[i] in;        f[0][0] = 1;        for(int i=1;i<=n;i++)                for(ll j=0;j<=m;j++)                        for(int k=0;k<=min(a[i],j);k++)                                f[i][j] = (f[i][j] + f[i - 1][j - k]) % 1000007;        printf("%d",f[n][m] % 1000007);}//COYG