描述


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. 关于sqlserver 2008 远程导入表数据

    /*不同服务器数据库之间的数据操作*/ --创建链接服务器 exec sp_addlinkedserver   'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 ' ex ...

  2. java 利用注解实现BaseDao 增删查改

    第一步,编写两个注解类,用于表明实体类对应的表名及字段. TableInfo.java 此注解用于标注表名及主键名 import static java.lang.annotation.Element ...

  3. 安卓模拟器"bluestacks"在电脑上的设置.(宽,高)

    可以在手机上找到大量英语学习APP. 习惯使用电脑的朋友,可以安装模拟器来使用这些APP. bluestacks 是一款比较好的模拟器. 但其默认的宽,高,却无法在软件中修改. 找到一个比较好的教程来 ...

  4. 两个for循环例子

    var i,j; var a=0; // for(i=0,j=0;i<5,j<7;i++,j++){ // a=i+j; // } // alert(a) //12 for(i=0,j=0 ...

  5. svg学习笔记(二)

    SMIL animation演示代码集锦 <svg width="1400" height="1600" xmlns="http://www.w ...

  6. 2016年1月编程语言排行榜:Java荣获2015年度冠军

    Java因于2015年人气增幅最大(+ 5.94%),故获得2015年的TIOBE指数的编程语言奖,同时成为15年年度冠军, Visual Basic.NET(+ 1.51%)和Python(+ 1. ...

  7. 翻译:ECMAScript 5.1简介

    简介 ECMAScript 5.1 (或仅 ES5) 是ECMAScript(基于JavaScript的规范)标准最新修正. 与HTML5规范进程本质类似,ES5通过对现有JavaScript方法添加 ...

  8. odoo 使用 80 端口

    OE安装好,一般需要通过 8069端口来访问. 1:Aapche2 安装 sudo apt-get install apache2 2.安装mod_proxy cd /etc/apache2/mods ...

  9. SQL函数:小写金额转换成大写

    /********************************************************作者:版本:1.0创建时间:20020227修改时间:功能:小写金额转换成大写参数:n ...

  10. Js Carousel

    http://getbootstrap.com/javascript/#carousel http://owlgraphic.com/owlcarousel/#demo https://www.mob ...