Jury Compromise POJ - 1015

版权声明: 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;
}

猜你喜欢

转载自blog.csdn.net/weixin_40959045/article/details/88382037