Cod sursa(job #2957156)

Utilizator alexei.222Andrei Alexei alexei.222 Data 21 decembrie 2022 19:19:40
Problema Problema rucsacului Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include<string.h>
#include<stdio.h>
#include<vector>
#include<algorithm>

using namespace std;

#define maxn 5001

int wt[maxn], val[maxn];

int k = 0;
    
void init(int bt[]) {
    if (k==0) {
        bt[k] = -1;
    } else {
        bt[k] = bt[k-1];
    }
}

int succesor(int bt[], int n) {
    if (bt[k] == n - 1) return 0;
    
    bt[k]++;
    return 1;
}

int valid(int bt[], int W) {
    int s = 0;
    for (int i = 0; i <= k; i++) {
        s += wt[bt[i]];
    }
    
    if (s > W) return 0;
    
    return 1;
}

void sol(int bt[], int &vmax) {
    
    int s = 0;
    for (int i = 0; i <= k; i++) {
        s += val[bt[i]];
    }
    
    if (s > vmax) {
        vmax = s;
    }
}

int main() {
	int N, G;

	scanf("%d %d", &N, &G);

    for (int i = 0; i < N; ++i) {
		scanf("%d %d", &wt[i], &val[i]);
	}

    int bt[N];
    int as, ev;
    
    int vmax = -1;

    init(bt);
        
    while (k >= 0) {
        do {
            as = succesor(bt, N);
            
            if (as) {
                ev = valid(bt, G);
            }
            
        } while (as && !ev);
                
        if (as) {
            sol(bt, vmax);
            
            k++;
            init(bt);
        } else {
            k--;
        }
    }

    printf("%d", vmax);

    return 0;
}