求助,为什么过不了样例
查看原帖
求助,为什么过不了样例
305002
vegetable_ste楼主2021/9/17 23:03
#include <bits/stdc++.h>
using namespace std;
const int N = 100010, M = 18;
int n, m, a[N], sum[N], coin[M], total, ans = 0x3f3f3f3f;
int dp[1 << M];
int search(int x) {
	int L = 0, R = n, res = -1;
	while(L <= R) {
		int mid = (L + R) >> 1;
		if(sum[mid] <= x) { res = max(res, mid); L = mid + 1; }
		else R = mid - 1;
	}
	return res;
}
int main() {
	scanf("%d%d", &m, &n);
	for(int i = 1; i <= m; i ++ ) {
		scanf("%d", coin + i);
		total += coin[i];
	}
	for(int i = 1; i <= n; i ++ ) {
		scanf("%d", a + i);
		sum[i] = sum[i - 1] + a[i];
	}
	for(int i = 1; i < (1 << m); i ++ )
		for(int j = 1; j <= m; j ++ ) {
			int state = i;
			if(!(state & (1 << (j - 1)))) continue;
			int last = state ^ (1 << (j - 1)), lpos, rpos;
			lpos = dp[last];
			rpos = search(sum[lpos] + coin[j]);
			if(!rpos || rpos <= lpos) continue;
			dp[state] = max(dp[state], rpos);
			if(rpos == n) ans = min(ans, sum[lpos] + coin[j]);
		}
	if(ans > 1e9) puts("-1");
	else printf("%d\n", total - ans);
	return 0;
}

怀疑是更新 ansans 的问题

2021/9/17 23:03
加载中...