Pagini recente » Borderou de evaluare (job #1391455) | Cod sursa (job #3364153) | Cod sursa (job #1421998) | Cod sursa (job #3364352) | Cod sursa (job #3364136)
// Source: https://usaco.guide/general/io
#include <bits/stdc++.h>
using namespace std;
//dp[mask] = {a, b}
//a = numarul minim de camioane pentru a transporta obiectele din mask
//b = capacitatea minima ocupata a unui camion
const int INF = 1e9;
struct lol {
int nr_camioane;
int gr_minim;
};
lol dp[(1 << 17)];
int v[17];
int main() {
ifstream cin("zebughil.in");
ofstream cout("zebughil.out");
for(int t = 1; t <= 3; t++) {
int n, g;
cin >> n >> g;
for(int i = 0; i < n; i++) {
cin >> v[i];
}
for(int i = 0; i < (1 << n); i++) {
dp[i] = {INF, INF};
}
for(int i = 0; i < n; i++) {
dp[1 << i] = {1, v[i]};
}
for(int mask = 0; mask < (1 << n); mask++) {
if(dp[mask].nr_camioane == INF) {
for(int i = 0; i < n; i++) {
if(mask & (1 << i)) {
int pmask = mask - (1 << i);
if(dp[pmask].gr_minim + v[i] <= g) {
if(dp[pmask].nr_camioane < dp[mask].nr_camioane) {
dp[mask].nr_camioane = dp[pmask].nr_camioane;
dp[mask].gr_minim = dp[pmask].gr_minim + v[i];
} else {
if(dp[pmask].nr_camioane == dp[mask].nr_camioane) {
if(dp[pmask].gr_minim + v[i] < dp[mask].gr_minim) {
dp[mask].gr_minim = dp[pmask].gr_minim + v[i];
}
}
}
} else {
if(dp[pmask].nr_camioane + 1 < dp[mask].nr_camioane) {
dp[mask].nr_camioane = dp[pmask].nr_camioane + 1;
dp[mask].gr_minim = dp[pmask].gr_minim + v[i];
} else {
if(dp[pmask].nr_camioane + 1 == dp[mask].nr_camioane) {
if(v[i] < dp[mask].gr_minim) {
dp[mask].gr_minim = v[i];
}
}
}
}
}
}
}
}
cout << dp[(1 << n) - 1].nr_camioane << '\n';
}
}