Ant Counting

题目描述: 有一天,贝茜无聊地坐在蚂蚁洞前看蚂蚁们进进出出地搬运食物.很快贝茜发现有些蚂蚁长得几乎一模一样,于是她认为那些蚂蚁是兄弟,也就是说它们是同一个家族里的成员.她也发现整个蚂蚁群里有时只有一只出来觅食,有时是几只,有时干脆整个蚁群一起出来.这样一来,蚂蚁们出行觅食时的组队方案就有很多种.作为一头有数学头脑的奶牛,贝茜注意到整个蚂蚁群由T(1≤T≤1000)个家族组成,她将这些家族按1到T依次编号.编号为i的家族里有Ni(1≤Ni≤100)只蚂蚁.同一个家族里的蚂蚁可以认为是完全相同的.
如果一共有S,S+1….,B(1≤S≤B≤A)只蚂蚁一起出去觅食,它们一共能组成多少种不同的队伍呢?注意:只要两支队伍中所包含某个家族的蚂蚁数不同,我们就认为这两支队伍不同.由于贝茜无法分辨出同一家族的蚂蚁,所以当两支队伍中所包含的所有家族的蚂蚁数都相同时,即使有某个家族换了几只蚂蚁出来,贝茜也会因为看不出不同而把它们认为是同一支队伍.
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}
*第1行:可以创建的大小为S…B(包括)的集合数。 像{1,2}这样的集合与集合{2,1}相同,不应重复计算。 仅打印此数字的最后六位数,不带前导零或空格。

思路分析:
我们先分析核心代码的来处:
f[i][j]=从前i种物品中选取j个物品的组合总数。
为了从前i种物品中选取j个,我们可以先从前i-1种物品中选取j-k个,然后在从第i个物品中补上剩下的k个
所以可以得到以下递推关系:
当j>a[i]时(j-1-a[i]>=0):
f[i][j]=f[i−1][j]+f[i−1][j−1]+…+f[i−1][j−ai]f[i][j]=f[i−1][j]+f[i−1][j−1]+…+f[i−1][j−ai] ,;
我们求 f[i][j] 的时候可以使用 f[i][j−1] 计算过的值,避免重复枚举 k.
f[i][j−1]=f[i−1][j−1]+…+f[i−1][j−ai−1];
根据上个式子我们可以得到:
f[i][j]=f[i][j−1]+f[i−1][j]−f[i−1][j−ai−1];

那么我们该怎么理解上述的式子呢?
1.不选选第i种:f[i-1][j];就是在前i-1种里面选择j个;
2.选择第i种 :f[i][j-1]-f[i-1][j-a[i]-1];
我们可以这样理解选择的情况:f[i][j-1]我们可以认为是选择了第i种1个,至于后面我们还选不选第i种我们先不管。f[i][j-1]是在前i种选择j-1个可组成的种数,那么它包含了选a[i]个第i种的情况,即f[i-1][j-a[i]-1],但是f[i][j]最多也就是拿x[i]项,所以要在这里减去f[i-1][j-a[i]-1];

当j<=a[i]时:

f[i][j]=f[i−1][j]+f[i−1][j−1]+…+f[i−1][0];
f[i][j-1] = f[i−1][j−1]+…+f[i−1][0];
由上面的两个式子可知:
f[i][j] = f[i-1][j]+f[i][j-1];
此处分析和上面的差不多,只是不可能存在第i种都取的情况;

#include<cstdio>
#include <iostream>
#include <algorithm>using namespace std;
#define Maxn 1000
#define Maxm 100
#define Mod 1000000
int num[Maxn + 5], f[Maxn + 5][Maxn * Maxm + 5];int main() {int t, a, s, b, ans = 0;scanf("%d %d %d %d", &t, &a, &s, &b);for (int i = 1; i <= a; i++) {          //存储每种的数量int x;scanf("%d", &x);num[x]++;}for (int i = 0; i <= t; i++)f[i][0] = 1;   //取0都会是一种for (int i = 1; i <= a; i++) {for (int j = 1; j <= t; j++) {if (j - 1 - num[i] >= 0)f[i][j] = (f[i - 1][j] + f[i][j - 1] - f[i-1][j - 1 - num[i]] + Mod) % Mod;elsef[i][j] = (f[i - 1][j] + f[i][j - 1])%Mod;}}for (int i = s; i <= b; i++){ans += f[t][i];ans%=Mod;}printf("%d\n", ans);return 0;
}

Ant Counting多重集组合数相关推荐

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

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

  2. bzoj 1630 2023: [Usaco2005 Nov]Ant Counting 数蚂蚁(有重复元素的组合数)

    2023: [Usaco2005 Nov]Ant Counting 数蚂蚁 Time Limit: 4 Sec  Memory Limit: 64 MB Submit: 281  Solved: 18 ...

  3. 多重集表示合json数据_计数DP(划分数,多重集组合数)

    划分数:把n个无区别的物品划分成不超过m组. dp[i][j]=j的i划分的总数. dp[i[j]=dp[i][j-i]+dp[i-1][j] 即:将j个物品分成i份,有两种情况:每份划分都大于等于1 ...

  4. 【组合数学】排列组合 ( 多重集组合数示例 | 三个计数模型 | 选取问题 | 多重集组合问题 | 不定方程非负整数解问题 )

    文章目录 一.多重集组合示例 二.三个计数模型 排列组合参考博客 : [组合数学]基本计数原则 ( 加法原则 | 乘法原则 ) [组合数学]集合的排列组合问题示例 ( 排列 | 组合 | 圆排列 | ...

  5. 【组合数学】排列组合 ( 多重集组合数 | 所有元素重复度大于组合数 | 多重集组合数 推导 1 分割线推导 | 多重集组合数 推导 2 不定方程非负整数解个数推导 )

    文章目录 一.多重集组合 ( 所有元素重复度大于组合数 ) 二.多重集组合 所有元素重复度大于组合数 推导 1 ( 分割线推导 ) 二.多重集组合 所有元素重复度大于组合数 推导 2 ( 不定方程非负 ...

  6. 【BZOJ】1630: [Usaco2007 Demo]Ant Counting(裸dp/dp/生成函数)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1630 题意,给你n种数,数量为m个,求所有的数组成的集合选长度l-r的个数 后两者待会写.. 裸dp ...

  7. POJ - 3046 多重集组合数问题的线性DP(四种方法)

    t 种蚂蚁,共a只,同种蚂蚁不区分,构成各种大小的不同多重集,问大小在闭区间[s,b]的多重集共有多少个 多重集的意思是元素可重复,构成元素或重数不同就是不同的多重集,比如{1,1,2,3}是一个多重 ...

  8. poj3046 Ant Counting

    题目链接:http://poj.org/problem?id=3046 Description Bessie was poking around the ant hill one day watchi ...

  9. Ant Counting

    前言 题目 Input Output Sample Input Sample Output 大意 分析 代码 前言 不知道为什么有这么多英文题... 题目 Bessie was poking arou ...

最新文章

  1. Rank() over()的用法
  2. 2019年5月12日-linux就该这么学-第6课
  3. 2017Android通用流行框架大全
  4. ai3中文语音补丁_NS 暗黑破坏神3 中文补丁今日上线!刷起来
  5. python怎么知道用哪个库使用-Python绘图库讲解:4大常用库你准备学哪个?
  6. C++ 多线程教程及实现方法
  7. html帮助文档乱码,使用doxygen生成的帮助文档,中文出现乱码的问题
  8. 经典面试题:聊一聊垃圾回收算法
  9. python将输入值转化为元组_Python实现将元组中的元素作为参数传入函数的操作
  10. java双重循环去重_java List去除重复数据实现
  11. GML C++ Camera Calibration Toolbox 相机标定畸变矫正
  12. 「首席架构师推荐」统计软件一览表
  13. Ansible Ad-Hoc与常用模块
  14. 使用EXCEL进行数据分组分析法
  15. 高等数学学习笔记——第六十一讲——空间曲线的弧长与曲率
  16. 用防火墙自动拦截攻击IP
  17. 定义一个Traingle类用来刻画“三角形”,要求:Trangle类具有类型为double的三个边以及周长、面积属性,具有一个boolean型的属性,该属性的值为true时代表三个边属性能构成一个三角
  18. 爬虫之BeautifulSoup
  19. 网络流-割的概念以及定理
  20. 2019.8.22 1.属性

热门文章

  1. 开源项目贡献者_入职开源贡献者的10个技巧
  2. maxcompute操作_MaxCompute(原ODPS)使用总结-初级篇
  3. 技不压身,多门手艺多条出路
  4. 索引图像转换为真彩色图像--MATLAB
  5. 为什么不要工程中不要随意使用define定义常量
  6. Python接口自动化-python使用requests库发送Get请求
  7. 南卡Neo骨传导运动耳机正式发布,打造音质最强款骨传导耳机
  8. python svg2rlg_python – 从svg转换为pdf
  9. ElasticSearch删除数据后释放磁盘空间
  10. HTML:让表单 文本框 只读,不可编辑的方法