码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 3046 Ant Counting

时间:2015-08-28 10:52:41      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:

POJ 3046 Ant Counting

题目大意:有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     

 

POJ 3046 Ant Counting

标签:

原文地址:http://www.cnblogs.com/xlsryj/p/4765727.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!