这道题由于本人才初中,对这类数学没有了解,所以我的思路是这样的
我把这个问题想象成把物品放进盒子里,那么当我指定我手上有i个物品,有j个盒子时,我有放第i个物品和不放第i个物品两种做法
当我放的时候,我可以得到,f(i,j)=f(i-1,j-1)
当我不放的时候,那么f(i,j)=f(i-1,j),然而呢,这个物品我最终还是要放进盒子里,然而我可以放进这j个盒子中的任意一个,那么得到f(i,j)=j*f(i-1,j)
所以我们最终得到状态转移方程f(i,j)=f(i-1,j-1)+j*f(i-1,j)
那么我们只需要把有j个盒子的这个j从1遍历到n就解决了
然而最后还是错的......
下面是我的代码
#include <bits/stdc++.h>
using namespace std;
int huafen(int i,int j)
{
if(i==j) return 1;
if(i<j) return 0;
if(i<0) return 0;
return huafen(i-1,j-1)+j*huafen(i-1,j);
}
int main()
{
int n[1005],t,i;
long long ans[1005];
cin>>t;
for(i=0;i<t;i++)
cin>>n[i];
for(i=0;i<t;i++)
{
for(int j=1;j<=n[i];j++)
ans[i]+=huafen(n[i],j);
cout<<ans[i]<<endl;
}
}