时间:1s 空间:256M
题目描述:
小信过生日了,家里来了n个朋友,小信要给他们分蛋糕。小信有重量为k的蛋糕,已知每个盘子最多能装重量为m的蛋糕,且至少要给朋友分重量为1的蛋糕(小信可以不吃),请问小信有几种分蛋糕的方法。
由于答案可能非常大,输出答案模998244353。
输入格式:
第一行包含三个整数 n,m,k,表示朋友数,盘子最多能装的蛋糕重量,蛋糕总重量。
输出格式:
输出一个整数表示答案。
样例1输入:
2 3 4
样例1输出:
6
约定:
对于100%的数据,1≤n,m≤50,n≤k≤n×m。
题意:
有n个朋友,重量为k的蛋糕,个盘子最多能装重量为m的蛋糕,且至少要给朋友分重量为1的蛋糕请问小信有几种分蛋糕的方法。
分析:
这道题搜索是比较好判断出来的,总共的蛋糕数量不能比k多,所以在搜索是要保证,剩余蛋糕数量是要比人数多的,这是第一个条件,每个人分的蛋糕重量在1~m之间(不能超过总人数减去现在人数),你必须留下这么多,不然不够分,这便是决策集合,然后去不停的分蛋糕就好了。
Code:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int f[1010][2510];
int n,m,w,ans,mod=998244353;
int dp(int x,int now)
{
if(now>w)return 0;
if(x>n)
{
if(now<=w)return 1;
}
if(f[x][now]!=-1)return f[x][now];
int res=0;
for(int i=1;i<=min(m,w-now);i++)
{
res+=dp(x+1,now+i);
res%=mod;
}
return f[x][now]=res%mod;
}
signed main()
{
memset(f,-1,sizeof(f));
cin>>n>>m>>w;
cout<<dp(1,0);
}