Date:January 30th Title: 集训Day3-小信分蛋糕 题解

时间:1s 空间:256M

题目描述:

小信过生日了,家里来了n个朋友,小信要给他们分蛋糕。小信有重量为k的蛋糕,已知每个盘子最多能装重量为m的蛋糕,且至少要给朋友分重量为1的蛋糕(小信可以不吃),请问小信有几种分蛋糕的方法。

由于答案可能非常大,输出答案模998244353

输入格式:

第一行包含三个整数 n,m,k,表示朋友数,盘子最多能装的蛋糕重量,蛋糕总重量。

输出格式:

输出一个整数表示答案。

样例1输入:

2 3 4

样例1输出:

6

约定:

对于100%的数据,1≤n,m≤50n≤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);
}

The End

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值