Group Projects


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 \(10^9 + 7\).

Sample Input

3 2

2 4 5

Sample Output

3


题目大意

有n个商品,每个商品有不同的价值。要求把这些商品分组,每组有一个值为组内商品的最大价值差,问是这些每组值的和不超过m的方案数,答案对\(1e9+7\)取模。

这道题的定义比较难,首先我们我们对商品按其价值由小到大进行排序。我们可以发现,每一组的价值差为相邻商品价值差的和。

定义dp[i][j][k]表示前i件商品还有j组未完成,差值为k的分组种数。

共有4种转移方案

temp = (a[i] - a[i-1]) * j;

  1. 第i件商品加入一个新分组,并且该分组未完成; dp[i][j+1][k] = dp[i][j+1][k] + dp[i-1][j][k-temp];
  2. 第i件商品加入一个新分组,并且该分组只有一个元素;dp[i][j][k] = dp[i][j][k] + dp[i-1][j][k-temp];
  3. 第i件商品加入一个之前的分组,并且该分组未完成; dp[i][j][k] = dp[i][j][k] + dp[i-1][j][k-temp] * j;
  4. 第i件商品加入一个之前的分组,并且该分组已完成。 dp[i][j-1][k] = dp[i][j-1][k] + dp[i-1][j][k-temp] * j;

每一个转移都只与i 和 i-1有关,所以我们可以用滚动数组进行优化,

时间复杂度为\(O(n^2k)\), 空间复杂度为\(nk\).

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int mod = 1e9 + 7;
int n,m;
int dp[2][210][1010];
int a[210]; int main(){
ios::sync_with_stdio(false); cin.tie(0);
cin >> n >> m;
for(int i = 1;i <= n;i++)cin >> a[i];
sort(a + 1,a + n + 1); dp[0][0][0] = 1;
int cur = 0;
for(int i = 1;i <= n;i++){
cur ^= 1;
memset(dp[cur],0,sizeof(dp[cur]));
int v = a[i] - a[i-1];
for(int j = 0;j < i;j++){
int temp = v * j;
for(int k = temp;k <= m;k++){
dp[cur][j + 1][k] = (dp[cur][j + 1][k] + dp[cur^1][j][k-temp]) % mod;
dp[cur][j][k] = (dp[cur][j][k] + dp[cur^1][j][k-temp]) % mod;
if(j)dp[cur][j-1][k] = (dp[cur][j-1][k] + (long long)dp[cur^1][j][k-temp] * j) % mod;
if(j)dp[cur][j][k] = (dp[cur][j][k] + (long long)dp[cur^1][j][k-temp] * j) % mod;
}
}
}
int ans = 0;
for(int i = 0;i <= m;i++)
ans = (ans + dp[cur][0][i]) % mod;
cout << ans << endl;
return 0;
}

[Codeforces626F] Group Projects (DP)的更多相关文章

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

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

  2. 8VC Venture Cup 2016 - Elimination Round F. Group Projects dp

    F. Group Projects 题目连接: http://www.codeforces.com/contest/626/problem/F Description There are n stud ...

  3. DP的序--Codeforces626F. Group Projects

    $n \leq 200$个数,$ \leq 500$,$K \leq 1000$代价内的数字分组有多少?一个分组的代价是分成的每个小组的总代价:一个小组的代价是极差. 问的极差那就从极入手嘛.一个小组 ...

  4. Codeforces 626F Group Projects(滚动数组+差分dp)

    F. Group Projects time limit per test:2 seconds memory limit per test:256 megabytes input:standard i ...

  5. 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 ...

  6. 【CodeForces】626 F. Group Projects 动态规划

    [题目]F. Group Projects [题意]给定k和n个数字ai,要求分成若干集合使得每个集合内部极差的总和不超过k的方案数.n<=200,m<=1000,1<=ai< ...

  7. [CF626F]Group Projects

    [CF626F]Group Projects 题目大意: 有一个长度为\(n(n\le200)\)的数列\(\{A_i\}\),将其划分成若干个子集,每个子集贡献为子集\(\max-\min\).求子 ...

  8. Codeforces 626F Group Projects (DP)

    题目链接  8VC Venture Cup 2016 - Elimination Round 题意  把$n$个物品分成若干组,每个组的代价为组内价值的极差,求所有组的代价之和不超过$k$的方案数. ...

  9. VK Cup 2015 - Round 2 (unofficial online mirror, Div. 1 only) B. Work Group 树形dp

    题目链接: http://codeforces.com/problemset/problem/533/B B. Work Group time limit per test2 secondsmemor ...

随机推荐

  1. css3:与背景的相关样式

    1. (1)background-origin : border-box | padding-box | content-box;(设置元素背景图片的原始起始位置.) //需要注意的是,如果背景不是n ...

  2. paper 58 :机器视觉学习笔记(1)——OpenCV配置

    开始学习opencv! 1.什么是OpenCV OpenCV的全称是:Open Source Computer Vision Library.OpenCV是一个基于(开源)发行的跨平台计算机视觉库,可 ...

  3. mysql创建视图

    CREATE ALGORI`sync_user`CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER V ...

  4. 160929、各数据库连接配置与maven依赖安装

    最近做的项目都是maven的,据说maven是个东西.把依赖的jar文件的事情都委托出去辣!试着用了一下哈,效果还可以! 今天做了数据库配置这一块,特意把相关的东西总结出来,以备不时之需. MySQL ...

  5. PHPExcel读取excel文件示例

    PHPExcel读取excel文件示例PHPExcel最新版官方下载网址:http://phpexcel.codeplex.com/PHPExcel是一个非常方便生成Excel格式文件的类,官方下载包 ...

  6. Bind[Exclude|Include]排除字段或只允许字段验证

    public ActionResult xx([Bind(Exclude = "id")] xxModel xx, HttpPostedFileBase file)//排除id验证 ...

  7. XML 解析 -- IE ,Chrome

    通用的method <script type="text/javascript"> //for chrome, attach method to XMLDocument ...

  8. nginx完美支持tp框架

    nginx完美支持tp框架 server { listen 80; server_name mit.520m.com.cn; access_log /data/wwwlogs/mit.520m.com ...

  9. JavaEE基础(二)

    1.Java语言基础(常量的概述和使用) A:什么是常量 在程序执行的过程中其值不可以发生改变 B:Java中常量的分类 字面值常量 自定义常量(面向对象部分讲) C:字面值常量的分类 字符串常量 用 ...

  10. for_each()的返回值

    有三种办法可以从“运用了function object”的算法中获取“结果”或“反馈”: 1.在外部持有状态,并让function object指向它: 2.以by reference方式传递func ...