siciliy1564HOUSING

来源:互联网 发布:java scanner用法int 编辑:程序博客网 时间:2024/06/03 14:02

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;}


原创粉丝点击