P1077摆花
题目
分析
题目大致意思是:有n种花,每种花的盆数范围是0~a[i],求这n种花盆数取值之和恰好是m的组合数
状态:
f[i][j][k]:第i种花取j盆时,数字和为k的组合数
决策:
f[i][j][k] = f[i-1][p][k-j];(当前取值之和的组合数=上一种花取值之和的组合数+当前种花的取值组合数)
答案:
f[n][i][m];
代码
#include<bits/stdc++.h>
using namespace std;
const int N = 105,mod = 1e6+7;
int n,m,ans,a[N],f[N][N][N];
int main(){
cin>>n>>m;
for(int i = 1;i<=n;i++)
cin>>a[i];
f[0][0][0] = 1;
for(int i = 1;i<=n;i++){
for(int k = 0;k<=m;k++){
for(int j = 0;j<=min(a[i],k);j++){
if(!j && !k)f[i][j][k] = 1;
else{
for(int p = 0;p<=max(a[i-1],k-j);p++){
f[i][j][k] += f[i-1][p][k-j];
f[i][j][k] %= mod;
}
}
}
}
}
for(int i = 0;i<=min(a[n],m);i++){
ans += f[n][i][m];
ans %= mod;
}
cout<<ans;
return 0;
}