F. Group Projects

题目连接:

http://www.codeforces.com/contest/626/problem/F

Description

There are n students in a class working on group projects. The students will divide into groups (some students may be in groups alone), work on their independent pieces, and then discuss the results together. It takes the i-th student ai minutes to finish his/her independent piece.

If students work at different paces, it can be frustrating for the faster students and stressful for the slower ones. In particular, the imbalance of a group is defined as the maximum ai in the group minus the minimum ai in the group. Note that a group containing a single student has an imbalance of 0. How many ways are there for the students to divide into groups so that the total imbalance of all groups is at most k?

Two divisions are considered distinct if there exists a pair of students who work in the same group in one division but different groups in the other.

Input

The first line contains two space-separated integers n and k (1 ≤ n ≤ 200, 0 ≤ k ≤ 1000) — the number of students and the maximum total imbalance allowed, respectively.

The second line contains n space-separated integers ai (1 ≤ ai ≤ 500) — the time it takes the i-th student to complete his/her independent piece of work.

Output

Print a single integer, the number of ways the students can form groups. As the answer may be large, print its value modulo 109 + 7.

Sample Input

3 2

2 4 5

Sample Output

3

Hint

题意

有n个人,每个人有能力值ai,你需要去将这n个人分组

每一组的分值是这一个组的最大值减去最小值,你需要使得所有组的分值和小于等于k

问你方案数一共有多少种

题解:

dp

我们先排序,这样好DP

dp[i][j][k]表示考虑了i个人,现在open的组有j个(只有最小值,没有最大值的组),分值和为k的方案数

我们考虑第i个人加进去的时候,他对分值的贡献,应该是j*(a[i]-a[i-1]),不管这个数加到哪个组里面,贡献都是这个。

为什么?因为open的都在等待最大值的到来咯,考虑差分。

然后转移的时候,可以新开一个open,可以转移到open里面去,可以关闭一个open

空间开不下,滚一下就好了。

代码

#include<bits/stdc++.h>
using namespace std;
const int mod = 1e9+7;
int dp[2][205][1005];
int a[1005];
int n,k;
void update(int &x,int y)
{
x=(x+y)%mod;
}
int main()
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
sort(a+1,a+1+n);
dp[0][0][0]=1;
for(int i=1;i<=n;i++)
{
memset(dp[1],0,sizeof(dp[1]));
for(int j=0;j<=n;j++)
{
for(int p=0;p<=k;p++)
{
if(p+j*(a[i]-a[i-1])<=k)
{
update(dp[1][j][p+j*(a[i]-a[i-1])],dp[0][j][p]);
if(j>=1)
{
update(dp[1][j-1][p+j*(a[i]-a[i-1])],1LL*dp[0][j][p]*j%mod);
update(dp[1][j][p+j*(a[i]-a[i-1])],1LL*dp[0][j][p]*j%mod);
}
update(dp[1][j+1][p+j*(a[i]-a[i-1])],dp[0][j][p]);
}
}
}
memcpy(dp[0],dp[1],sizeof(dp[0]));
}
int ans = 0;
for(int i=0;i<=k;i++)
update(ans,dp[0][0][i]);
cout<<ans<<endl;
}

8VC Venture Cup 2016 - Elimination Round F. Group Projects dp的更多相关文章

  1. 8VC Venture Cup 2016 - Elimination Round F - Group Projects dp好题

    F - Group Projects 题目大意:给你n个物品, 每个物品有个权值ai, 把它们分成若干组, 总消耗为每组里的最大值减最小值之和. 问你一共有多少种分组方法. 思路:感觉刚看到的时候的想 ...

  2. Codeforces 8VC Venture Cup 2016 - Elimination Round F. Group Projects 差分DP*****

    F. Group Projects   There are n students in a class working on group projects. The students will div ...

  3. 8VC Venture Cup 2016 - Elimination Round

    在家补补题   模拟 A - Robot Sequence #include <bits/stdc++.h> char str[202]; void move(int &x, in ...

  4. 8VC Venture Cup 2016 - Elimination Round G. Raffles 线段树

    G. Raffles 题目连接: http://www.codeforces.com/contest/626/problem/G Description Johnny is at a carnival ...

  5. 8VC Venture Cup 2016 - Elimination Round D. Jerry's Protest 暴力

    D. Jerry's Protest 题目连接: http://www.codeforces.com/contest/626/problem/D Description Andrew and Jerr ...

  6. 8VC Venture Cup 2016 - Elimination Round (C. Block Towers)

    题目链接:http://codeforces.com/contest/626/problem/C 题意就是给你n个分别拿着2的倍数积木的小朋友和m个分别拿着3的倍数积木的小朋友,每个小朋友拿着积木的数 ...

  7. codeforces 8VC Venture Cup 2016 - Elimination Round C. Lieges of Legendre

    C. Lieges of Legendre 题意:给n,m表示有n个为2的倍数,m个为3的倍数:问这n+m个数不重复时的最大值 最小为多少? 数据:(0 ≤ n, m ≤ 1 000 000, n + ...

  8. 8VC Venture Cup 2016 - Elimination Round E. Simple Skewness 暴力+二分

    E. Simple Skewness 题目连接: http://www.codeforces.com/contest/626/problem/E Description Define the simp ...

  9. 8VC Venture Cup 2016 - Elimination Round C. Block Towers 二分

    C. Block Towers 题目连接: http://www.codeforces.com/contest/626/problem/C Description Students in a clas ...

随机推荐

  1. python基础===Excel处理库openpyxl

    openpyxl是一个第三方库,可以处理xlsx格式的Excel文件. 安装: pip install openpyxl 对如下excel进行读取操作,如图: from openpyxl import ...

  2. centos6.5升级Linux内核步骤

    centos6.5升级Linux内核步骤 http://www.jianshu.com/p/c75f00182b4c 使用的操作系统是是centos6.5,按照官方的推荐的配置,把linux内核升级到 ...

  3. Redis 分片实现 Redis Shard [www]

    Redis 分片实现                                             Redis Shard https://www.oschina.net/p/redis-s ...

  4. 可以高度定制的代理服务器anyproxy

    简介 anyproxy是一款可以高度定制的代理服务器,基于nodejs. 特征 支持https明文代理 支持低网速模拟 支持二次开发,可以用javascript控制代理的全部流程,搭建前端个性化调试环 ...

  5. java的equal和==问题

    看一本比较简略的java教程,在看到对象的时候,书上直接给我来一句: 刚看下觉得没什么问题,很有道理的一个东东嘛,但是出于习惯还是打了几行代码测试了一下,代码如下: class Person { pr ...

  6. caffe Python API 之LRN

    net.mylrn = caffe.layers.LRN(net.pool1,local_size=5,alpha=1e-4,beta=0.75) 输出: layer { name: "my ...

  7. MongoDB的win安装教程

    写在前面的 Mongo DB 是目前在IT行业非常流行的一种非关系型数据库(NoSql),其灵活的数据存储方式备受当前IT从业人员的青睐.Mongo DB很好的实现了面向对象的思想(OO思想),在Mo ...

  8. 《java并发编程实战》读书笔记2--对象的共享,可见性,安全发布,线程封闭,不变性

    这章的主要内容是:如何共享和发布对象,从而使它们能够安全地由多个线程同时访问. 内存的可见性 确保当一个线程修改了对象状态后,其他线程能够看到发生的状态变化. 上面的程序中NoVisibility可能 ...

  9. Binary Tree Preorder Traversal——经典算法的迭代求解(前序,中序,后序都在这里了)

    先序遍历,用递归来做,简单的不能再简单了.代码如下: (以下仅实现了先序遍历,中序遍历类似,后序遍历和这两个思路不一样,具体详见Binary Tree Postorder Traversal) /** ...

  10. QT中ui更改后不能更新的解决方法

    ui源文件到界面显示的原理可以网上搜索,这里不再描述.简单讲就是先要从*.ui生成ui_*.h然后再编译,所以界面未更新实际上是因为ui_*.h这个文件没有更新导致的. 出现此问题后我尝试了以下几个方 ...