[USACO13NOV]没有找零No Change

【代码】

#include<bits/stdc++.h>

using namespace std;

const int N = 100100, M=21;

int n, m, v[N], f[1 << M], MAX, a[N], sum[N], p,tot = 0, ans = -1, cnt;

int main() {
	sum[0] = 0;
	scanf("%d%d", &m, &n);
	for(int i = 1; i <= m; i++) {
		scanf("%d", &v[i]);
		tot += v[i];
	}
	for(int i = 1; i <= n; i++) {
		scanf("%d", &a[i]);
		sum[i] = sum[i - 1] + a[i];
	}
	MAX = (1 << m);
	for(int i = 0; i < MAX; ++i)
		for(int j = 0; j < m; ++j)
			if(i & 1 << j) {
				p = f[i ^ 1 << j];
				p = upper_bound(sum + 1, sum + 1 + n, sum[p] + v[j + 1]) - sum ;
				f[i] = max(f[i], p - 1);
			}
	for(int i = 0; i < MAX; ++i)
		if(f[i] == n) {
			cnt = 0;
			for(int j = 0; j < m; ++j)
				if(i & 1 << j)
					cnt += v[j + 1];
			ans = max(ans, tot - cnt);
		}
	if(ans >= 0)
		printf("%d\n", ans);
	else 
		puts("-1");
	return 0;
}
posted @ 2018-03-26 08:55  绍兴土匪  阅读(127)  评论(0)    收藏  举报