您的位置:首页 > 其它

【动态规划】[NOIP2012]摆花

2017-09-07 16:37 162 查看
题目

动态规划

定义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
[m] % 1000007);
}

//COYG
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: