Ant Counting多重集组合数
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多重集组合数相关推荐
- POJ 3046 Ant Counting ( 多重集组合数 经典DP )
题意 : 有 n 种蚂蚁,第 i 种蚂蚁有ai个,一共有 A 个蚂蚁.不同类别的蚂蚁可以相互区分,但同种类别的蚂蚁不能相互区别.从这些蚂蚁中分别取出S,S+1...B个,一共有多少种取法. 分析 : ...
- bzoj 1630 2023: [Usaco2005 Nov]Ant Counting 数蚂蚁(有重复元素的组合数)
2023: [Usaco2005 Nov]Ant Counting 数蚂蚁 Time Limit: 4 Sec Memory Limit: 64 MB Submit: 281 Solved: 18 ...
- 多重集表示合json数据_计数DP(划分数,多重集组合数)
划分数:把n个无区别的物品划分成不超过m组. dp[i][j]=j的i划分的总数. dp[i[j]=dp[i][j-i]+dp[i-1][j] 即:将j个物品分成i份,有两种情况:每份划分都大于等于1 ...
- 【组合数学】排列组合 ( 多重集组合数示例 | 三个计数模型 | 选取问题 | 多重集组合问题 | 不定方程非负整数解问题 )
文章目录 一.多重集组合示例 二.三个计数模型 排列组合参考博客 : [组合数学]基本计数原则 ( 加法原则 | 乘法原则 ) [组合数学]集合的排列组合问题示例 ( 排列 | 组合 | 圆排列 | ...
- 【组合数学】排列组合 ( 多重集组合数 | 所有元素重复度大于组合数 | 多重集组合数 推导 1 分割线推导 | 多重集组合数 推导 2 不定方程非负整数解个数推导 )
文章目录 一.多重集组合 ( 所有元素重复度大于组合数 ) 二.多重集组合 所有元素重复度大于组合数 推导 1 ( 分割线推导 ) 二.多重集组合 所有元素重复度大于组合数 推导 2 ( 不定方程非负 ...
- 【BZOJ】1630: [Usaco2007 Demo]Ant Counting(裸dp/dp/生成函数)
http://www.lydsy.com/JudgeOnline/problem.php?id=1630 题意,给你n种数,数量为m个,求所有的数组成的集合选长度l-r的个数 后两者待会写.. 裸dp ...
- POJ - 3046 多重集组合数问题的线性DP(四种方法)
t 种蚂蚁,共a只,同种蚂蚁不区分,构成各种大小的不同多重集,问大小在闭区间[s,b]的多重集共有多少个 多重集的意思是元素可重复,构成元素或重数不同就是不同的多重集,比如{1,1,2,3}是一个多重 ...
- poj3046 Ant Counting
题目链接:http://poj.org/problem?id=3046 Description Bessie was poking around the ant hill one day watchi ...
- Ant Counting
前言 题目 Input Output Sample Input Sample Output 大意 分析 代码 前言 不知道为什么有这么多英文题... 题目 Bessie was poking arou ...
最新文章
- Rank() over()的用法
- 2019年5月12日-linux就该这么学-第6课
- 2017Android通用流行框架大全
- ai3中文语音补丁_NS 暗黑破坏神3 中文补丁今日上线!刷起来
- python怎么知道用哪个库使用-Python绘图库讲解:4大常用库你准备学哪个?
- C++ 多线程教程及实现方法
- html帮助文档乱码,使用doxygen生成的帮助文档,中文出现乱码的问题
- 经典面试题:聊一聊垃圾回收算法
- python将输入值转化为元组_Python实现将元组中的元素作为参数传入函数的操作
- java双重循环去重_java List去除重复数据实现
- GML C++ Camera Calibration Toolbox 相机标定畸变矫正
- 「首席架构师推荐」统计软件一览表
- Ansible Ad-Hoc与常用模块
- 使用EXCEL进行数据分组分析法
- 高等数学学习笔记——第六十一讲——空间曲线的弧长与曲率
- 用防火墙自动拦截攻击IP
- 定义一个Traingle类用来刻画“三角形”,要求:Trangle类具有类型为double的三个边以及周长、面积属性,具有一个boolean型的属性,该属性的值为true时代表三个边属性能构成一个三角
- 爬虫之BeautifulSoup
- 网络流-割的概念以及定理
- 2019.8.22 1.属性