题目链接
题目大意
有一个w*h的格子,现在有n米长的绸带,现在用绸带去铺这个格子,填充的格子形状不能是所有列都一样高的,绸带可以用任意米。问有多少种填充法。
解题思路
dp[i][j]代表用了j米的绸带有i列上有绸带;
那么枚举第j列上放了多少米的绸带就可以转移方程了
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
long long dp[105][10005];
long long mod=1e9+7;
int main()
{
int n,w,h;
while(~scanf("%d %d %d",&n,&w,&h))
{
if(n>w*h)
n=w*h;
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
dp[0][i]=1;
for(int i=1;i<=w;i++)
dp[i][0]=1;
dp[0][0]=1;
for(int i=1;i<=w;i++)
{
for(int j=1;j<=n;j++)
{
for(int k=0;k<=h;k++)//第j列上放了几米的绸带
{
if(j>=k)
{
dp[i][j]+=dp[i-1][j-k];
dp[i][j]%=mod;
}
}
}
}
int a=n/w;
printf("%lld\n",(dp[w][n]-a-1+mod)%mod);
}
return 0;
}