1 #include<iostream>
2 #include<set>
3 #include<cstdio>
4 #include<cmath>
5 #include<vector>
6 #include<algorithm>
7 #define MAXN 40004
8 using namespace std;
9 typedef long long int ll;
10 int dp[MAXN];
11 struct point {
12 int x,y;
13 int val,t;
14 point(){}
15 point(int _x, int _y, int _t, int _val):x(_x),y(_y),t(_t),val(_val){};
16 };
17 point start(0,0,0,0);
18
19 int dis2(const point &p, const point &q)
20 {
21 return (p.x - q.x)*(p.x - q.x) + (p.y - q.y)*(p.y - q.y);
22 }
23
24 int cross(const point &p1, const point &p2, const point &q1, const point &q2)
25 {
26 return (q2.y - q1.y)*(p2.x - p1.x) - (q2.x - q1.x)*(p2.y - p1.y);
27 }
28
29 bool cmp(const point &p, const point &q)
30 {
31 return cross(start,p,start,q) > 0 || (cross(start,p,start,q) == 0 && dis2(start,p) < dis2(start,q));
32 }
33
34 int main()
35 {
36 int n,t;
37 int cnt(1);
38 while (scanf("%d%d",&n,&t) != EOF) {
39 cout<<"Case "<<cnt++<<": ";
40 memset(dp,0,sizeof(dp));
41 vector<point> data;
42 vector<point> gold;
43 point temp;
44 for (int i(0); i<n; ++i) {
45 scanf("%d%d%d%d",&temp.x,&temp.y,&temp.t,&temp.val);
46 gold.push_back(temp);
47 }
48 sort(gold.begin(),gold.end(),cmp);
49 data.push_back(gold[0]);
50
51 for (int i(1); i<gold.size() || !data.empty(); ++i) {
52 if ((i >= gold.size() && !data.empty()) || cross(start,gold[i],start,gold[i-1]) != 0) {
53 for (int j(t); j>=0; --j) {
54 for (int k(0); k<data.size(); ++k) {
55 if (j - data[k].t >= 0) {
56 dp[j] = max(dp[j],dp[j-data[k].t] + data[k].val);
57 }
58 }
59 }
60 data.clear();
61 if (i < gold.size())data.push_back(gold[i]);
62 } else {
63 if (cross(start,gold[i],start,gold[i-1]) == 0) {
64 gold[i].val += gold[i-1].val;
65 gold[i].t += gold[i-1].t;
66 data.push_back(gold[i]);
67 }
68 }
69 }
70 cout<<dp[t]<<endl;
71 }
72 return 0;
73 }