求助状压DP TLE63
查看原帖
求助状压DP TLE63
1050426
lxy_qwq楼主2025/6/29 11:24
#include <bits/stdc++.h>
using namespace std;
int m, n;
constexpr int MAXN = 100000 + 5;
constexpr int MAXM = (1 << 16) + 5;
int w[MAXN];
long long money[MAXN];
int qzh[MAXN];
long long dp[MAXM];
bool check(int l, int r, int now) {
	long long sum = qzh[r] - qzh[l];
	if (now >= sum) {
		return 1;
	}
	else {
		return 0;
	}
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr); cout.tie(nullptr);
	int ssum = 0;
	cin >> m >> n;
	for (register int i = 1; i <= m; i++) {
		cin >> money[i];
		ssum += money[i];
	}
	for (register int i = 1; i <= n; i++) {
		cin >> w[i];
	}
	for (register int i = 1; i <= n; i++) {
		qzh[i] = qzh[i - 1] + w[i];
	}
	for (register int k = 0; k < (1 << m); ++k) {
		for (register int i = 1; i <= m; i++) {
			if (!(k & (1 << (i - 1)))) {
				continue;
			}
			long long ans = dp[k ^ (1 << (i - 1))];
			int l = ans + 1, r = n;
			long long result = ans;
			while (l <= r) {
				int mid = (l + r) / 2;
				if (check(ans, mid, money[i])) {
					result = mid;
					l++;
				}
				else {
					r--;
				}
			}
			dp[k] = max(dp[k], result);
		}
	}
	long long result = INT_MAX;
	for (register int k = 0; k < (1 << m); ++k) {
		if (dp[k] == n) {
			long long sum = 0;
			for (register int i = 1; i <= m; i++) {
				if (!(k & (1 << (i - 1)))) {
					continue;
				}
				sum += money[i];

			}
			result = min(result, sum);
		}
	}
	if (result == INT_MAX)cout << -1 << endl;
	else cout << ssum - result << endl;
	return 0;
}
2025/6/29 11:24
加载中...