方案数

题目大意:

Smart老师今天特别开心,因为同学们考试考得都特别的好!于是Smart老师买了好多黑色和白色巧克力(可以认为数量无限)来奖励大家,让同学们自己来拿巧克力,但有如下限制:
1、每个人最少拿一块巧克力;
2、每个人只能拿一种颜色的巧克力;
3、拿黑色巧克力的人不少于C 个;
4、第i 个人最多拿a[i]个黑巧克力,或最多拿b[i]个白巧克力。
请问N(编号1~N)个同学拿巧克力可能的方案数是多少?

解题思路:

还是dp~至于转移方程:
if (j

#include <cstdio>
using namespace std;
int n,c,a[100005],b[100005],f[100005][25];
int main()
{
    //freopen("fas.in","r",stdin);
    //freopen("fas.out","w",stdout);
    scanf("%d%d",&n,&c);
    f[0][0]=1;
    for (int i=1;i<=n;i++)
     scanf("%d",&a[i]),a[i]%=10007;
    for (int i=1;i<=n;i++)
     {
        scanf("%d",&b[i]); b[i]%=10007;
        f[i][0]+=f[i-1][0]*b[i];//初始化
        f[i][0]%=10007;
     }
    for (int i=1;i<=n;i++)
     for (int j=1;j<=c;j++)
      {
        if (j<c)
         f[i][j]=((f[i-1][j-1]*a[i])%10007+(f[i-1][j]*b[i])%10007)%10007;
        else
         f[i][j]=(f[i-1][j-1]*a[i]%10007+f[i-1][j]*(a[i]+b[i])%10007)%10007;
      }
    printf("%d",f[n][c]%10007);//答案要模10007
    return 0;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值