背包贪心求助
查看原帖
背包贪心求助
943083
wfc284楼主2025/7/1 11:30

求大佬注意 /bx /bx

#include <bits/stdc++.h>
using namespace std;

//#define filename "xxx" 
#define FileOperations() freopen(filename".in", "r", stdin), freopen(filename".out", "w", stdout)
//#define multi_cases 1

#define inf 0x3f3f3f3f
#define Linf 0x3f3f3f3f3f3f3f3f
#define pii pair<int, int> 
#define all(v) v.begin(), v.end()
#define upw(i, a, b) for(int i = (a); i <= (b); ++i)
#define dnw(i, a, b) for(int i = (a); i >= (b); --i)

template<class T> bool vmax(T &a, T b) { return b > a ? a = b, true : false; }
template<class T> bool vmin(T &a, T b) { return b < a ? a = b, true : false; }
template<class T> void clear(T &x) { T().swap(x); }

const int N = 52, M = 125002;

#define int long long

int n, X, d;
int m[N];
vector<int> g[N];

int sz[N];
void DFS(int u) {
	sz[u] = 1;
	for(auto v : g[u]) DFS(v), sz[u] += sz[v], m[u] += m[v];
}

int f[M];

void update(int v, int w) { dnw(j, 125000, v) vmin(f[j], f[j - v] + w); }

void apart(int v, int w) {
	int x = min(n, d);
	for(int i = 0; 1 << i <= x; ++i) {
		update(v * (1 << i), w * (1 << i));
		x -= 1 << i;
	}
	if(x) update(v * x, w * x);
}

int pos[N];

void Traveller() {
	cin >> n >> X >> d;
	upw(i, 1, n) {
		int fa = 0;
		cin >> m[i];
		if(i != 1) cin >> fa;
		g[fa].push_back(i);
	}
	DFS(1);
	
	memset(f, 127, sizeof(f));
	f[0] = 0;
	upw(i, 1, n) apart(sz[i], m[i]);
	
	upw(i, 1, n) pos[i] = i;
	sort(pos+1, pos+n+1, [&] (int x, int y) { return sz[x] * m[y] > sz[y] * m[x]; });
	
	// upw(i, 1, n) cerr << pos[i] << ' ';
	// cerr << '\n';
	
	int ans = 0;
	upw(i, 0, 125000) if(f[i] <= X) {
		int r = X - f[i], res = i;
		upw(j, 1, n) {
			int v = sz[pos[j]], w = m[pos[j]];
			int c = pos[j] != 1 ? d - min(d, n) : 1e9;
			if(c * w <= r) {
				r -= c * w;
				res += c * v;
			}
			else {
				res += r / w * v;
				break;
			}
		}
		vmax(ans, res);
	}
	cout << ans << '\n';
}

signed main() {
#ifdef filename
	FileOperations();
#endif
	
	signed _ = 1;
#ifdef multi_cases
	scanf("%d", &_);
#endif
	while(_--) Traveller();
	return 0;
}

只挂了一个点,submission.

2025/7/1 11:30
加载中...