版权声明: https://blog.csdn.net/weixin_40959045/article/details/88382037
poj数据不够完善
for (int k = 1; k <= N; k++){
for (int i = M - 1; i >= 0; i--) {
for (int j = 0; j <= 2 * fix; j++) {
if (DP[i][j] >= 0) {
if (DP[i + 1][j + del[k]] <= DP[i][j] + sum[k]) {
DP[i + 1][j + del[k]] = DP[i][j] + sum[k];
path[i + 1][j + del[k]] = path[i][j];
path[i + 1][j + del[k]].push_back(k);
}
}
}
}
}
注意枚举每个人对应的影响,逆向处理出路径。并保存路径上的点
#include<iostream>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
using namespace std;
#define fst first
#define sec second
#define sci(num) scanf("%d",&num)
#define scl(num) scanf("%lld",&num)
#define mem(a,b) memset(a,b,sizeof a)
#define cpy(a,b) memcopy(a,b,sizeof b)
typedef long long LL;
typedef pair<int,int> P;
const int MAX_N = 210;
const int MAX_M = 10000;
int DP[21][1000];
vector<int> path[21][1000];
int p[MAX_N],d[MAX_N],del[MAX_N],sum[MAX_N];
int N,M;
int main() {
int cs = 1;
while (~scanf("%d%d", &N, &M)) {
if (N == 0 && M == 0) break;
for (int i = 1; i <= N; i++) {
sci(p[i]);
sci(d[i]);
del[i] = p[i] - d[i];
sum[i] = p[i] + d[i];
}
int fix = 20 * M;
for (int i = 0;i <= M;i++) {
for (int j = 0;j <= 2 * fix;j++)
path[i][j].clear();
}
mem(DP, -1);
DP[0][fix] = 0;
for (int k = 1; k <= N; k++){
for (int i = M - 1; i >= 0; i--) {
for (int j = 0; j <= 2 * fix; j++) {
if (DP[i][j] >= 0) {
if (DP[i + 1][j + del[k]] <= DP[i][j] + sum[k]) {
DP[i + 1][j + del[k]] = DP[i][j] + sum[k];
path[i + 1][j + del[k]] = path[i][j];
path[i + 1][j + del[k]].push_back(k);
}
}
}
}
}
int now;
for (now = 0;fix -now >= 0; now++) {
if (DP[M][now + fix] >= 0) break;
if (DP[M][fix - now] >= 0) break;
}
int fdel;
if (DP[M][now + fix] > DP[M][fix - now]) {
fdel = now + fix;
} else {
fdel = fix -now;
}
int sp = (DP[M][fdel] + (fdel - fix)) / 2;
int sd = (DP[M][fdel] - (fdel - fix)) / 2;
printf("Jury #%d\n",cs++);
printf("Best jury has value %d for
prosecution
and value %d for defence:\n",sp,sd);
for (int i = 1;i <= M;i++) {
printf(" %d",path[M][fdel][i - 1]);
}
printf("\n\n");
}
return 0;
}