描述


http://poj.org/problem?id=3046

n种蚂蚁,第i种有ai个,不同种类的蚂蚁可以相互区分,但同一种类的蚂蚁不能相互区分,从这些蚂蚁中取出s,s+1,s+2,...,b-1,b个,问每种取的方式的取法数之和.

原型:多重集组合数:

n种物品,第i种有ai个.不同种类的物品可以相互区分,但同一种类的物品不能相互区分.从这些物品中取出m个,有多少种取法?

Ant Counting
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 4358   Accepted: 1689

Description

Bessie was poking around the ant hill one day watching the ants march to and fro while gathering food. She realized that many of the ants were siblings, indistinguishable from one another. She also realized the sometimes only one ant would go for food, sometimes a few, and sometimes all of them. This made for a large number of different sets of ants!

Being a bit mathematical, Bessie started wondering. Bessie noted
that the hive has T (1 <= T <= 1,000) families of ants which she
labeled 1..T (A ants altogether). Each family had some number Ni (1
<= Ni <= 100) of ants.

How many groups of sizes S, S+1, ..., B (1 <= S <= B <= A) can be formed?

While observing one group, the set of three ant families was seen as
{1, 1, 2, 2, 3}, though rarely in that order. The possible sets of
marching ants were:

3 sets with 1 ant: {1} {2} {3}

5 sets with 2 ants: {1,1} {1,2} {1,3} {2,2} {2,3}

5 sets with 3 ants: {1,1,2} {1,1,3} {1,2,2} {1,2,3} {2,2,3}

3 sets with 4 ants: {1,2,2,3} {1,1,2,2} {1,1,2,3}

1 set with 5 ants: {1,1,2,2,3}

Your job is to count the number of possible sets of ants given the data above.

Input

* Line 1: 4 space-separated integers: T, A, S, and B

* Lines 2..A+1: Each line contains a single integer that is an ant type present in the hive

Output

*
Line 1: The number of sets of size S..B (inclusive) that can be
created. A set like {1,2} is the same as the set {2,1} and should not be
double-counted. Print only the LAST SIX DIGITS of this number, with no
leading zeroes or spaces.

Sample Input

3 5 2 3
1
2
2
1
3

Sample Output

10

Hint

INPUT DETAILS:

Three types of ants (1..3); 5 ants altogether. How many sets of size 2 or size 3 can be made?

OUTPUT DETAILS:

5 sets of ants with two members; 5 more sets of ants with three members

Source

分析


一.原型算法:

dp[i][j]表示在前i种物品中取出j个的组合数.

那么可以从前(i-1)个中取(j-k)个,再从第i个中取k个,则有:

dp[i][j]=Σdp[i-1][j-k](0<=k<=min(a[i],j)).枚举i,j,k,这样的算法是O(n*m^2)的.

优化:

Σdp[i-1][j-k](0<=k<=min(a[i],j))进行变形:

讨论a[i]j的关系:

1.a[i]<jmin(a[i],j)=a[i]

则有:Σdp[i-1][j-k](0<=k<=min(a[i],j))=Σdp[i-1][j-1-k](0<=k<=min(a[i],j-1))+dp[i-1][j]-dp[i][j-1-a[i]].

即:dp[i][j]=dp[i-1][j]+dp[i][j-1]+dp[i-1][j-1-a[i]];

2.a[i]>=jmin(a[i],j)=j

则有:Σdp[i-1][j-k](0<=k<=min(a[i],j))=Σdp[i-1][(j-1)-k](0<=k<=min(a[i],j-1))+dp[i-1][j].

即:dp[i][j]=dp[i-1][j]+dp[i][j-1].

综上:

if(j--a[i])>= dp[i][j]=dp[i-][j]+dp[i][j-]-dp[i-][j--a[i]];

else dp[i][j]=dp[i-][j]+dp[i][j-];

继续优化,在空间上,dp只用到了i和i-1,可以考虑用滚动数组重复利用空间.

二.该题:

在原型的基础上最后进行一次统计,计算ans=Σ(dp[n][i])(s<=i<=t)即可.

 #include<cstdio>
#include<algorithm>
using namespace std; const int maxn=,maxm=*+,mod=1e6;
int n,m,s,b;
int a[maxn];
int dp[][maxm]; void solve()
{
dp[][]=dp[][]=;
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
if(j--a[i]>=)
{
dp[i&][j]=(dp[i&][j-]+dp[(i-)&][j]-dp[(i-)&][j--a[i]]+mod)%mod;
}
else
{
dp[i&][j]=(dp[i&][j-]+dp[(i-)&][j])%mod;
}
}
}
int ans=;
for(int i=s;i<=b;i++)
{
ans=(ans+dp[n&][i])%mod;
}
printf("%d\n",ans);
} void init()
{
scanf("%d%d%d%d",&n,&m,&s,&b);
for(int i=;i<=m;i++)
{
int now;
scanf("%d",&now);
a[now]++;
}
} int main()
{
#ifndef ONLINE_JUDGE
freopen("ant.in","r",stdin);
freopen("ant.out","w",stdout);
#endif
init();
solve();
#ifndef ONLINE_JUDGE
fclose(stdin);
fclose(stdout);
system("ant.out");
#endif
return ;
}

POJ_3046_Ant_Counting_(动态规划,多重集组合数)的更多相关文章

  1. Vijos_1792_摆花_(动态规划,多重集组合数)

    描述 https://vijos.org/p/1792 共n种花,第i种花有a[i]个,要摆m个,同一种花连续且花按照序号从小到大排,问共有多少种摆花方案.   描述 小明的花店新开张,为了吸引顾客, ...

  2. poj 3046 Ant Counting(多重集组合数)

    Ant Counting Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other) Total ...

  3. poj3046 Ant Counting——多重集组合数

    题目:http://poj.org/problem?id=3046 就是多重集组合数(分组背包优化): 从式子角度考虑:(干脆看这篇博客) https://blog.csdn.net/viphong/ ...

  4. Java面试-动态规划与组合数

    最近在刷力扣上的题目,刷到了65不同路径,当初上大学的时候,曾在hihocoder上刷到过这道题目,但是现在已经几乎全忘光了,大概的知识点是动态规划,如今就让我们一起来回顾一下. 从题目说起 题目原文 ...

  5. POJ 3046 Ant Counting ( 多重集组合数 && 经典DP )

    题意 : 有 n 种蚂蚁,第 i 种蚂蚁有ai个,一共有 A 个蚂蚁.不同类别的蚂蚁可以相互区分,但同种类别的蚂蚁不能相互区别.从这些蚂蚁中分别取出S,S+1...B个,一共有多少种取法. 分析 :  ...

  6. 多重集组合数 简单dp

    #include <cstdio> #include <iostream> using namespace std; +; +; +; ; int n,m,M; int a[m ...

  7. 多重集组合数 (DP)

    输入: n=3 m=3 a={1,2,3} M=10000 输出: 6  (0+0+3,0+1+2,0+2+1,1+0+2,1+1+1,1+2+0) 为了不重复计数,同一种类的物品最好一次性处理好.于 ...

  8. 【POJ - 3046】Ant Counting(多重集组合数)

    Ant Counting 直接翻译了 Descriptions 贝西有T种蚂蚁共A只,每种蚂蚁有Ni只,同种蚂蚁不能区分,不同种蚂蚁可以区分,记Sum_i为i只蚂蚁构成不同的集合的方案数,问Sum_k ...

  9. DP的初级问题——01包、最长公共子序列、完全背包、01包value、多重部分和、最长上升子序列、划分数问题、多重集组合数

    当初学者最开始学习 dp 的时候往往接触的是一大堆的 背包 dp 问题, 那么我们在这里就不妨讨论一下常见的几种背包的 dp 问题: 初级的时候背包 dp 就完全相当于BFS DFS 进行搜索之后的记 ...

随机推荐

  1. MVC中如何在controller的action中输出JS到页面上

    MVC中如何在controller的action中输出JS到页面上 可以通过Http上下文对象(httpContext)就可以了,在Action中的HttpContext就是这个Action所指向的页 ...

  2. javascript dom 编程艺术笔记 第四章:图片库

    首先先建立一个html文件,建立一个图片库 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &q ...

  3. Spring 对JDBC的支持(JdbcTemplate)

    Spring对数据库的操作,使用JdbcTemplate对象 需要引入相关的jar文件 如版本:(Spring核心jar包就不列了) spring-jdbc-3.2.5.RELEASE.jar spr ...

  4. 安卓模拟器还是"genymotion"最靠谱.

    安卓模拟器还是"genymotion"最靠谱. genymotion

  5. 04_XML_03_XMLDTD约束与校验

    [什么是XML约束] 在XML技术里,可以编写一个文档来约束一个XML文档的书写规范,称之为XML约束. 常见的XML约束技术有:XML DTD和XML Schema DTD(Document Typ ...

  6. 使用 Virtual Box 安装 android x86

    1.安装 跟随别人的教程:http://www.maketecheasier.com/run-android-4-3-in-virtualbox/ 2.问题 安装过程出现以下问题:Kernel pan ...

  7. DevExpress控件-- Gridcontrol合并表头

    写在前面的话: 在园子里逛了有一段时间了,一直想写点东西,但苦于自己的水平有限,生怕写出来的东西浪费了读者的时间.楼主有幸参加了公司DevExpress控件的培训,独乐乐不如众乐乐,特附上Demo以飨 ...

  8. php访问控制

    访问控制 访问控制通过关键字public,protected和private来实现.被定义为公有的类成员可以在任何地方被访问.被定义为受保护的类成员则可以被其自身以及其子类和父类访问.被定义为私有的类 ...

  9. 关于mac上的homebrew

    首先它的安装指令并不难: /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/ ...

  10. WPF界面特殊字符处理

          界面XAML不支持< .>.&."等字符. 使用字符实体编码进行替代,以下是pro WPF 4.5的摘要表 Special Character        ...