阿瓦的礼物

题目描述
阿瓦是一只自称萝莉的小花猫,她生活在幻想世界。今天是阿瓦的生日,她邀请了她的朋友们来参加生日宴会。
她的朋友们各带了一件礼物到达阿瓦的家里,因为这些礼物实在是太多啦,阿瓦就把它们都放进了房间里,然 后出去切蛋糕去了。
阿瓦的许完了生日愿望之后吹灭了蜡烛,就在这个时刻,她听到了来自房间的一声巨响。跑过 去时候发现,所有的礼物都变成了一摊灰,有人送给阿瓦的礼物是一颗炸弹!
阿瓦非常的伤心,因为她回忆了礼物的大小形状后发现,炸弹可能还不止来源于一个朋友。首先,她记得每件 礼物对应的体积 Vi,阿瓦根据她的常识断定,
一颗炸弹的体积为 K,所以体积小于 K 的礼物里面一定装不下炸弹。 如果一件礼物的体积为 V,那么最多可以装下 V /K 个炸弹。
当一个人送出的礼物中含有炸弹时,他已经知道所有 的东西都会被炸成一摊灰,所以他不会再送炸弹外的东西。因此如果一个人送了炸弹,并且他送的礼物体积为 V, 那么他一定送了 V /K 个炸弹。
阿瓦还发现,能够造成这种杀伤力的,一定至少有 P 颗炸弹。
阿瓦由于沉浸在朋友背叛的痛苦当中,无心计算。她想请你帮忙算一下,有多少种可能的情况满足条件。即, 有多少种不同的送炸弹的人的名单,使得其中每个人都送了至少一颗炸弹,并且所有人送的炸弹个数加和大于等 于给出的 P。我们说两个名单不同,当且仅当至少存在一个人,在其中一个名单中没有出现,在另一个名单中出现了。

输入
第一行一个数 n,表示朋友的个数。 第二行 n 个数,第 i 个数 Vi 表示每个人送出的礼物的体积。 第三行两个数 K,P,分别表示一个炸弹的体积和至少有 P 颗炸弹

输出
5
5 4 3 3 1
1 5

样例输入
25

dp题
设立状态 f[i][j]表示前i个人送j个炸弹的方案数
1.第i个人不送炸弹 f[i][j]=f[i-1][j];
2.第i个人送炸弹,如果送的炸弹大于p,那么都变成p
f[i][min(p,j+a[i]/k)]=(f[i][min(p,j+a[i]/k)]+f[i-1][j]);

#include<bits/stdc++.h>
#define mod 998244353
using namespace std;
long long dp[3500][3500];
int n,p,a[3500],k;
int main()
{
    
    
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    cin>>k>>p;
 
    dp[1][0]=dp[1][a[1]/k]=1;
    for(int i=2;i<=n;i++)
    for(int j=0;j<=p;j++)
    {
    
    
     dp[i][j]+=dp[i-1][j];//不装
     if(a[i]/k)dp[i][min(p,j+a[i]/k)]=(dp[i][min(p,j+a[i]/k)]+dp[i-1][j])%mod;//zhuang
    }
    cout<<dp[n][p];
    return 0;
}

猜你喜欢

转载自blog.csdn.net/yhhy666/article/details/108222007
今日推荐