HDU4248【DP】

来源:互联网 发布:javascript 循环 编辑:程序博客网 时间:2024/05/21 20:29

题意:

有n种石头,每种石头有a[i]个,然后让你去组合,问有多少种组合;

思路:
这种题,排列组合知识一上,非常麻烦,已经搞了好几题,看似就是排列组合的姿势,然而最终都是一种递推,也就是DP,而且比较明显的是,基本上这种数的数量级就在100/1000这样。DP来还是很有道理的;

本题:

dp[i][j] 表示前i堆石子构成长度为j的串的方案数;

k代表第 i 堆对于j的使用量,num是当前构成的长度;

然后状态转移就是:dp[i,j]+=dp[i-1,j-k]*C[ k ,num ];

预处理组合数,利用组合的性质:C(n+1,i)=C(n,i)+C(n,i-1);

最后把所有长度的可能性的种类加起来。

#include<stdio.h>#include<queue>#include<string.h>#include<iostream>#include<algorithm>using namespace std;typedef long long LL;const int INF=0x3f3f3f3f;//dp[i][j] 表示前i堆石子构成长度为j的串的方案数;const int N=1e4+10;const LL mod=1e9+7;//int num[N];int num;LL dp[110][N];LL C[N][110];void init(){    C[0][0]=1;    for(int i=1;i<N;i++)        for(int j=0;j<=100;j++)        {            if(!j)                C[i][j]=C[i-1][j];            else                C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;        }}int main(){    init();    int cas=1;    int n;    while(~scanf("%d",&n))    {        memset(dp,0,sizeof(dp));        dp[0][0]=1;        int sum=0;        for(int i=1;i<=n;i++)        {            scanf("%d",&num);            sum+=num;            for(int k=0;k<=num;k++)                for(int j=k;j<=sum;j++)                    dp[i][j]=(dp[i][j]+(dp[i-1][j-k]*C[j][k]%mod))%mod;        }        LL ans=0;        for(int i=1;i<=sum;i++)            ans=(ans+dp[n][i])%mod;        printf("Case %d: ",cas++);        printf("%lld\n",ans);    }    return 0;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 农信房贷逾期几个小时怎么办 广东农信房贷逾期一天怎么办 三亚的房太潮了怎么办 没高中档案积分怎么办 临牌过期了怎么办 居住证凭证丢了怎么办 上海市居住证过期了怎么办 上海居住证积分不够怎么办 居住证登录密码忘记怎么办 投靠中考上海居住证怎么办 嫁入广州户口怎么办 上海积分扣完了怎么办 公立小学积分不够怎么办 查不到户口信息怎么办 小孩上不到户口怎么办 离开上海上海户口怎么办? 上海没房户口怎么办 没有房照动迁怎么办 持有上海居住证怎么办准生证 换公司后公积金怎么办 换工作了住房公积金怎么办 以前买的户口怎么办 上海落户积分不够怎么办 带坏受孕了怎么办 对公转账转错了怎么办 对公转错账怎么办 银行卡转错了怎么办 人户分离证明怎么办 暂居证怎么办才快 房产证户口本信息泄漏怎么办 户主迁走了户口怎么办 户口本丢了应该怎么办 户口本遗失了应该怎么办 户口迁出河南怎么办居住证 居住证学历写错怎么办 换单位了档案怎么办 辞职一年了档案怎么办 上海租房网签怎么办 户口本主页掉了怎么办 居转户办理中离职怎么办 上海居转户没有职称怎么办