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