hdu 2512

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2512

思路:

dp[i][j]表示第i张校园卡放到j本书中(保证每本书中必须至少有一张校园卡)的方案数,于是有dp[i][j]=j*dp[i-1][j]+dp[i-1][j-1](从i-1到i的状态可以在有j本书的情况下选择任意一本书放入校园卡,也可以放入放到新加进来的书中)这样的话最后只要FOR(i,1,n)sum+=dp[n][1]就可以啦(表示n张校园卡可以放入一本书或者2本书...或者n本书的情况总和)。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 #define MAXN 2020
 6 int dp[MAXN][MAXN];//dp[i][j]表示第i张校园卡放到j本书中(保证每本书中必须至少有一张校园卡)的方案数
 7 
 8 int main(){
 9     dp[1][1]=1,dp[2][1]=dp[2][2]=1;
10     for(int i=2;i<MAXN;i++){
11         for(int j=1;j<MAXN;j++){
12             dp[i][j]=max(dp[i][j],j*dp[i-1][j]+dp[i-1][j-1]);
13             dp[i][j]%=1000;
14         }
15     }
16     int _case,n;
17     scanf("%d",&_case);
18     while(_case--){
19         scanf("%d",&n);
20         int ans=0;
21         for(int i=1;i<=n;i++){
22             ans+=dp[n][i];
23         }
24         printf("%d\n",ans%1000);
25     }
26     return 0;
27 }
28 
29 
30         
View Code

 

posted @ 2013-05-18 11:21  ihge2k  阅读(202)  评论(0编辑  收藏  举报