DP,n个人入住,每间房最少住5个人,问有几种入住的方法。跟硬币题差不多,主要是注意初始的地方,一开始输出总是比标准答案小,想了好久
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
using namespace std;
vector<int> v;
typedef long long LL;
LL f[101][101];//f[i][j]总共i个人,由前j种每房间可能入住的总人数组成的方案数
LL dp(int n)
{
memset(f,0,sizeof(f));
for(int i = 0;i<n-4;++i)
f[0][i]=1;//这里如果不初始为1就会WA
for(int i = 5;i<=n;++i)
{
if(i%5==0)f[i][0] = 1;
}
for(int i = 5;i<=n;++i)
{
for(int j = 1;j<n-4;++j)
{
for(int k = 0;i-k*v[j]>=0;++k)
f[i][j]+=f[i-k*v[j]][j-1];
}
}
return f[n][n-5];
}
void print(int n)
{
for(int i = 0;i<=n;++i)
{
for(int j = 0;j<n-4;++j)
{
cout<<f[i][j]<<" ";
}
cout<<endl;
}
}
int main()
{
int n;
scanf("%d",&n);
for(int i = 5;i<=n;++i)
{
v.push_back(i);
}
printf("%d\n",dp(n));
return 0;
}