admin 管理员组

文章数量: 887021

运动会

运动会(group)
【问题描述】
在一次运会上,有一个比赛项目,共有 N 个人参加比赛,要将这 N 个人分组,每组人
数不少于 K 个,问有多少种分组方式?
比如有 16 个运动员,每组人数不少于 5 个,共有 6 种分组方式:
(1) 分一组,为 16 人;
(2) 分二组,分别为 11 人、5 人;
(3) 分二组,分别为 10 人、6 人;
(4) 分二组,分别为 9 人、7 人;
(5) 分二组,分别为 8 人、8 人;
(6) 分三组,分别为 6 人、5 人、5 人。
注意:6+5+5,5+6+5,5+5+6 为同一种,只算一种分组方式;
【输入文件】
输入文件 group.in 共一行为两个整数 N, K。表示有 N 个运动员分组,每组不少于 K 个
人(1 ≤ K ≤ N ≤ 500)。
【输出文件】
输出文件 group.out 共一行为一个整数,表示分组数。
结果可能很大,输出结果除以 10000007 的余数。
【输入】
16 5
【输出】
6

 

记忆化搜索 。。。

#include <cstdio>
#include <iostream>
using namespace std;
#define R register
#define ll long long
ll n,k;
ll f[505][505];
inline ll dfs(ll yu,ll last)
{if(f[yu][last]) return f[yu][last];ll sum=1;for(R ll i=last;i<=n;i++) {if(yu>=2*i) sum+=dfs(yu-i,i),sum%=10000007;}sum%=10000007;return f[yu][last]=sum;
}
int main()
{freopen("group.in","r",stdin);freopen("group.out","w",stdout);cin>>n>>k;cout<<dfs(n,k)<<endl;return 0;
}

好短....

转载于:.html

本文标签: 运动会