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

 

你可能感兴趣的:(HDU)