题意:

有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;
}

HDU4248【DP】的更多相关文章

  1. Kattis - honey【DP】

    Kattis - honey[DP] 题意 有一只蜜蜂,在它的蜂房当中,蜂房是正六边形的,然后它要出去,但是它只能走N步,第N步的时候要回到起点,给出N, 求方案总数 思路 用DP 因为N == 14 ...

  2. HDOJ 1423 Greatest Common Increasing Subsequence 【DP】【最长公共上升子序列】

    HDOJ 1423 Greatest Common Increasing Subsequence [DP][最长公共上升子序列] Time Limit: 2000/1000 MS (Java/Othe ...

  3. HDOJ 1501 Zipper 【DP】【DFS+剪枝】

    HDOJ 1501 Zipper [DP][DFS+剪枝] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...

  4. HDOJ 1257 最少拦截系统 【DP】

    HDOJ 1257 最少拦截系统 [DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...

  5. HDOJ 1159 Common Subsequence【DP】

    HDOJ 1159 Common Subsequence[DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ...

  6. HDOJ_1087_Super Jumping! Jumping! Jumping! 【DP】

    HDOJ_1087_Super Jumping! Jumping! Jumping! [DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: ...

  7. POJ_2533 Longest Ordered Subsequence【DP】【最长上升子序列】

    POJ_2533 Longest Ordered Subsequence[DP][最长递增子序列] Longest Ordered Subsequence Time Limit: 2000MS Mem ...

  8. HackerRank - common-child【DP】

    HackerRank - common-child[DP] 题意 给出两串长度相等的字符串,找出他们的最长公共子序列e 思路 字符串版的LCS AC代码 #include <iostream&g ...

  9. LeetCode:零钱兑换【322】【DP】

    LeetCode:零钱兑换[322][DP] 题目描述 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成 ...

随机推荐

  1. 简述C++中的多态机制

    前言 封装性,继承性,多态性是面向对象语言的三大特性.其中封装,继承好理解,而多态的概念让许多初学者感到困惑.本文将讲述C++中多态的概念以及多态的实现机制. 什么是多态? 多态就是多种形态,就是许多 ...

  2. Xcode 6 的新增特性

    本文转载至 http://www.cocoachina.com/ios/20140823/9441.html (via:苹果开发者中心)   Xcode 6 引入了设计和构建软件的崭新方式.Swift ...

  3. 分治分块与计算几何练习 [Cloned]

    https://cn.vjudge.net/contest/148706 A #include<cstdio> #include<cstring> #include<cm ...

  4. 【BZOJ1014】[JSOI2008]火星人prefix Splay+hash

    [BZOJ1014][JSOI2008]火星人prefix Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个 ...

  5. Package template (html/template) ... Types HTML, JS, URL, and others from content.go can carry safe content that is exempted from escaping. ... (*Template) Funcs ..

    https://godoc.org/text/template GoDoc Home About Go: text/templateIndex | Examples | Files | Directo ...

  6. Android笔记之dp与px之间的转换以及LayoutParams

    dp与px之间的转换公式 px = dp * (dpi / 160) dp = px / (dpi / 160) 其中dpi的获取方式如下 private void getDpi() { Displa ...

  7. Code Review 规范

    CodeReview规范 CodeReivew 标准 通用原则 提交 PR 的代码必须保证自测通过 只 review 代码规范.业务逻辑,不 review 架构设计(那是写代码前应该做的事情) 干掉重 ...

  8. [zjoi]青蛙的约会_扩展欧几里德

    两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝着对方那里跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚 ...

  9. 转载——Android permission 访问权限大全

    程序执行需要读取到安全敏感项必需在androidmanifest.xml中声明相关权限请求, 完整列表如下: Android.permission.ACCESS_CHECKIN_PROPERTIES ...

  10. jquery特效(4)—轮播图②(定时自动轮播)

    周末出去逛完街,就回公司好好地研究代码了,也算是把定时自动轮播程序写出来了,特意说明一下,这次的轮播图是在昨天随笔中jquery特效(3)—轮播图①(手动点击轮播)的基础上写出来的,也就是本次随笔展示 ...