标签:
题目大意:有T个蚂蚁家族,共A个蚂蚁,求元素个数为S到B的集合数
刚开始一头雾水,不知道从哪里入手。如何才能不重复计数,这时就用到了DP。定义DP数组,DP[i][j]:用前i种家族形成个数为j的集合数的值;
dp[i][j]=∑dp[i-1][j-k](k从0循环到family[i])。这样每次循环都插入新的家族成员,保证了不会重复计数。
注意:对于累加型的的循环要注意循环变量的内外设置。这个是对k的累加,对象是任意的j。所以,每一个j都有k的所有循环。
所以k循环应该是大循环,j是小循环。
1 #include<iostream> 2 using namespace std; 3 int dp[1001][10001]; 4 int family[1001]; 5 int main() 6 { 7 int T,A,S,B; 8 cin>>T>>A>>S>>B; 9 for(int i=0;i<A;i++) 10 { 11 int a; 12 cin>>a; 13 ++family[a]; 14 } 15 int total=family[0]; 16 dp[0][0]=1; 17 for(int i=1;i<=T;i++) 18 { 19 total+=family[i]; 20 for(int k=0;k<=family[i];k++) 21 { 22 //对于递推式子是在任意j的条件下对k的变化进行累加(即对每一个j都有这个变化),所以j应该是小循环 23 for(int j=total;j>=k;j--) 24 { 25 dp[i][j]=(dp[i][j]+dp[i-1][j-k])%1000000; 26 } 27 } 28 } 29 int result=0; 30 for(int i=S;i<=B;i++) 31 { 32 result=(result+dp[T][i])%1000000; 33 } 34 cout<<result<<endl; 35 return 0; 36 } 37 38
标签:
原文地址:http://www.cnblogs.com/xlsryj/p/4765727.html