作业介绍

#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;
}
状态
已结束
题目
12
开始时间
2026-10-3 0:00
截止时间
2026-10-10 23:59
可延期
24 小时