背包水题...一开始看着觉得是多重背包,其实是分组背包...
每个蚂蚁家庭是一个分组,每个分组选一种情况,从0到分组蚂蚁数上限;
最后把从s只到b只的记录加起来就行了,真心水...
注意要求输出最后六位数字,因范围过大,在加的过程中出现大于1e6的情况即应取模,(等于1e6应该也可以)。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
int r[100005];
int f[1005];
int main()
{
int t,a,s,b,i,j,k,sum;
while(scanf("%d%d%d%d",&t,&a,&s,&b)!=EOF)
{
sum=0;
memset(r,0,sizeof(r));
memset(f,0,sizeof(f));
for(i=0;i<a;i++)
{
scanf("%d",&j);
f[j-1]++;
}
r[0]=1;
for(i=0;i<t;i++)
{
for(j=b;j>=0;j--)
{
for(k=1;k<=f[i];k++)
{
if(j-k>=0){r[j]=r[j-k]+r[j];if(r[j]>1000000)r[j]=r[j]%1000000;}//取模
}
}
}
for(i=s;i<=b;i++)
sum=(sum+r[i])%1000000;
printf("%d\n",sum);
}
return 0;
}