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. ajax和servlet交互,表单日历插件,表单验证,form.js

    我的index.jsp <body> <a>点我获取数据</a> <table border=1px> <tr> <td>ID& ...

  2. java 项目打包流程速记

    1.与资源库同步 2.[解决冲突] --可能没有这一步 3.合并标记 4.清除一下项目-- clean 5.打包: run As -->Maven install 6.去服务备份原包,下载服务 ...

  3. Script to set the Purchase Order Status to ‘OPEN’(将采购订单重新打开)

    Business Requirement: The finance user requests the IT team to change the PO status to OPEN as they ...

  4. css 标签 清除浮动

    .clearfloat:after{content: "";clear:both;display: block;}

  5. 8007003Windows Update遇到未知错误

    如果在检查更新时收到 Windows Update 错误 80070003,则需要删除 Windows 用于标识计算机更新的临时文件.若要删除临时文件,请停止 Windows Update 服务,删除 ...

  6. yii2验证码的使用

    1.控制器中 public function actions()     {         return [             'captcha' => [               ...

  7. SQL Server数据库的三种恢复模式:简单恢复模式、完整恢复模式和大容量日志恢复模式(转载)

    SQL Server数据库有三种恢复模式:简单恢复模式.完整恢复模式和大容量日志恢复模式: 1.Simple 简单恢复模式, Simple模式的旧称叫”Checkpoint with truncate ...

  8. NOIP200902分数线划定

    NOIP200902分数线划定 描述 世博会志愿者的选拔工作正在 A 市如火如荼的进行.为了选拔最合适的人才,A 市对所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试.面试分数线根据 ...

  9. DirectX 绘制

    先上图.后面会描写 ,细节

  10. Asp.Net MVC 模型验证详解-实现客户端、服务端双重验证

    概要 在asp.net webform开发中经常会对用户提交输入的信息进行校验,一般为了安全起见大家都会在客户端进行Javascript(利于交互).服务端双重校验(安全).书写校验代码是一个繁琐的过 ...