【DP】统计蚂蚁(ants)

D e s c r i p t i o n Description Description

蚂蚁山上有T(1<=T<=1,000)种蚂蚁,标记为1…T,每种蚂蚁有N_i只蚂蚁(1<=N_i<=100),现有A(A<=5000)只蚂蚁,从中选出S,S+1,…,B(1<=S<=B<=A)只蚂蚁一共有多少种选法?
如有5只蚂蚁分别为{1,1,2,2,3},一共有3种蚂蚁,每一种蚂蚁的数量分别为2,2,1,以下是选不同数量蚂蚁的方法:

1个蚂蚁3种选法:{1}{2}{3}

2个蚂蚁5种选法:{1,1}{1,2}{1,3}{2,2}{2,3}

3个蚂蚁5种选法:{1,1,2}{1,1,3}{1,2,2}{1,2,3}{2,2,3}

4个蚂蚁3种选法:{1,2,2,3}{1,1,2,2}{1,1,2,3}

5个蚂蚁1种选法:{1,1,2,2,3}

你的任务是从中选S…B只蚂蚁的方法总和。

I n p u t Input Input

第一行: 4个空格隔开的整数: T, A, S和B;
第2到A+1行:每行一个整数表示蚂蚁的种类。

O u t p u t Output Output

输出从A只蚂蚁中选出S…B只蚂蚁的方法数,答案保留后6位。

S a m p l e Sample Sample I n p u t Input Input
3 5 2 3
1
2
2
1
3
S a m p l e Sample Sample O u t p u t Output Output
10 

H i n t Hint Hint

对于30%的数据:T<=30,A<=100;
对于50%的数据:T<=100,A<=400;
对于100%的数据:T<=1000,A<=5000;

T r a i n Train Train o f of of T h o u g h t Thought Thought

大爷博客

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#define Mod 1000000
#define ll long long
using namespace std;

ll F[1005][5005], Sum[5005];
ll n, A, S, B, k, Ans;

int main()
{
    
    
	scanf("%lld%lld%lld%lld", &n, &A, &S, &B);
	for(int i = 1; i <= A; ++i)
		scanf("%lld", &k), Sum[k]++;
	F[0][0] = 1;
	for(int i = 1; i <= n; ++i)
	{
    
    
		memset(F[i], 0, sizeof(F[i]));
		for(int j = 0; j <= B; ++j)
			for(int k = 0; k <= Sum[i] && k + j <= B; ++k)
				F[i][j + k] = (F[i][j + k] + F[i - 1][j]) % Mod;
	}
	for(int i = S; i <= B; ++i) 
		Ans = (Ans + F[n][i]) % Mod;
	printf("%lld", Ans);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/SSL_wujiajie/article/details/108164443