简单背包DP,RE求调
查看原帖
简单背包DP,RE求调
1025329
_psycho楼主2024/11/12 17:26
#include <bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define db double
#define gc getchar
#define pii pair<int,int>
#define pb push_back
#define mk make_pair
#define fir first
#define sec second
using namespace std;

const int delta = 400;
inline int read() {
	int s = 0, f = 1;
	char c = getchar();
	while (c < '0' || c > '9') {
		if (c == '-') f = -1;
		c = getchar();
	}
	while (c >= '0' && c <= '9') {
		s = s * 10 + c - 48;
		c = getchar();
	}
	return s * f;
}
int n, m;
int f[405][1005];
int prt_ans[405][205][1005];
int d[405], p[405];
int suma, sumb;
int cnt = 0;
int A[100005];
int tot = 0;
inline void solve(int i, int j, int k) {
	if (!j) return;
	int in = prt_ans[i][j][k + delta];
	solve(in - 1, j - 1, j - (d[in] - p[in]));
	A[++ tot] = in;
	suma += d[in], sumb += p[in];
}
signed main() {
	while (cin >> n >> m && n && m) {
		for (int i = 1; i <= n; i ++) d[i] = read(), p[i] = read();
		memset(f, 128, sizeof f);
		f[0][delta] = 0;
		for (int i = 1; i <= n; i ++) {
			for (int j = 0; j <= m; j ++) {
				for (int k = -400; k <= 400; k ++) {
					prt_ans[i][j][k + delta] = prt_ans[i - 1][j][k + delta];
				}
			}
			for (int j = m; j; j --) {
				for (int k = -400; k <= 400; k ++) {
					if (k - (d[i] - p[i]) < -400 || k - (d[i] - p[i]) > 400) continue;
					int nw = f[j][k + delta];
					f[j][k + delta] = max(f[j][k + delta], f[j - 1][k + delta - d[i] + p[i]] + d[i] + p[i]);
					if (f[j][k + delta] > nw) {
						prt_ans[i][j][k + delta] = i;
					}
				}
			}
		}
		int ans = 400;
		for(int i = -400; i <= 400; i++){
			if(f[m][i + delta] < 0) continue;
			if(abs(i) < abs(ans) || (abs(i) == abs(ans) && f[m][i + delta] > f[m][ans + delta])) ans = i;
		}
		tot = suma = sumb = 0;
		solve(n, m, ans);
		printf("Jury #%lld\n", ++cnt);
		printf("Best jury has value %lld for prosecution and value %lld for defence:\n", suma, sumb);
		for(int i = 1; i <= tot; i++) printf(" %lld", A[i]);
		printf("\n\n");
	}
	return 0;
}

2024/11/12 17:26
加载中...