#include <bits/stdc++.h>
using namespace std;
const int N = 305;
int n, m, a[N];
vector<int>e[N];
int f[N][N], siz[N];
void dfs(int x, int fa) {
f[x][1] = a[x];
siz[x] = 1;
for (auto v : e[x]) {
if (v == fa)
continue;
dfs(v, x);
siz[x] += siz[v];
for (int i = m + 1; i >= 1; i--) {
for (int j = min(i - 1, siz[v]); j >= 1; j--) {
f[x][i] = max(f[x][i], f[v][j] + f[x][i - j]);
}
}
}
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
int fa;
cin >> fa >> a[i];
e[fa].push_back(i);
e[i].push_back(fa);
}
dfs(0, -1);
cout << f[0][m + 1] << endl;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 105;
int n, m, siz[N];
int f[N][105];
struct node {
int v, w;
};
vector<node>e[N];
void dfs(int x, int fa, int w) {
siz[x] = 1;
for (auto [v, W] : e[x]) {
if (v == fa)
continue;
dfs(v, x, W);
siz[x] += siz[v];
for (int i = m; i >= 1; i--) {
for (int k = min(i - 1, siz[v] - 1); k >= 0; k--) {
f[x][i] = max(f[x][i], f[v][k] + f[x][i - k - 1] + W);
}
}
}
}
int main() {
cin >> n >> m;
for (int i = 1; i < n; i++) {
int x, y, z;
cin >> x >> y >> z;
e[x].push_back({y, z});
e[y].push_back({x, z});
}
dfs(1, 0, 0);
cout << f[1][m] << endl;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 3005;
int n, m, f[N][N];
int a[N], siz[N];
struct node {
int v, w;
};
vector<node>e[N];
void dfs(int x, int fa) {
if (x >= n - m + 1) {
f[x][1] = a[x];
}
siz[x] = 1;
for (auto [v, w] : e[x]) {
if (v == fa)
continue;
dfs(v, x);
siz[x] += siz[v];
}
for (auto [v, w] : e[x]) {
if (v == fa)
continue;
for (int i = siz[x]; i >= 0; i--) {
for (int j = min(i, siz[v]); j >= 0; j--) {
f[x][i] = max(f[x][i], f[v][j] + f[x][i - j] - w);
}
}
}
}
int main() {
cin >> n >> m;
memset(f, 0xcf, sizeof(f));
for (int i = 1; i <= n - m; i++) {
int k;
cin >> k;
for (int j = 1; j <= k; j++) {
int x, y;
cin >> x >> y;
e[i].push_back({x, y});
e[x].push_back({i, y});
}
}
for (int i = n - m + 1; i <= n; i++)
cin >> a[i];
for (int i = 1; i <= n; i++)
f[i][0] = 0;
dfs(1, 0);
for (int i = n; i >= 0; i--) {
if (f[1][i] >= 0) {
cout << i << endl;
return 0;
}
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 205;
int v[N], c[N], n, m;
double tmpv[N];
int check(double x) {
int cnt = 0;
for (int i = 1; i <= n; i++) {
tmpv[i] = 1.0 * v[i] - x * c[i];
}
sort(tmpv + 1, tmpv + n + 1, greater<double>());
double sum = 0;
//int cnt = 0;
for (int i = 1; i <= n; i++) {
sum += tmpv[i];
if (sum >= 0) {
cnt++;
}
}
return cnt >= m;
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> v[i];
}
for (int i = 1; i <= n; i++) {
cin >> c[i];
}
// cout << check(1.6) << endl;
double l = 0, r = 1e9;
while (r - l >= 1e-5) {
double mid = (l + r) / 2;
// cout << l << " " << r << " " << check(mid) << endl;
if (check(mid)) {
l = mid;
} else
r = mid;
}
cout << fixed << setprecision(3) << l << endl;
return 0;
}