Pagini recente » Cod sursa (job #2401023) | Cod sursa (job #1130269) | Cod sursa (job #2343391) | Cod sursa (job #1588921) | Cod sursa (job #3289554)
#include <fstream>
using namespace std;
ifstream fin("zebughil.in");
ofstream fout("zebughil.out");
#define NMAX 20
#define INF 1000000000
int z[NMAX];
int dp[(1 << NMAX)][NMAX];
// luand blocurile pentru care biti sunt 1 in i, folosind j camioane
//si in dp[i][j] retin cat spatiu mai este in ultimul camion
int main() {
int t = 3;
while (t--) {
int n, g;
fin >> n >> g;
for (int i = 1; i <= n; ++i) {
fin >> z[i];
}
for (int i = 0; i < (1 << n); ++i) {
for (int j = 1; j <= n; ++j) {
dp[i][j] = INF;
}
}
dp[0][1] = g;
for (int i = 0; i < (1 << n); ++i) {
for (int j = 1; j <= n; ++j) {
if (dp[i][j] != INF) {
for (int k = 0; k < n; ++k) {
if ((i & (1 << k)) == 0) {
int conf = i + (1 << k);
if (z[k] <= dp[i][j]) {
dp[conf][j] = min(dp[conf][j], dp[i][j] - z[k]);
} else {
dp[conf][j + 1] = min(dp[conf][j + 1], g - z[k]);
}
}
}
}
}
}
int minim = n;
for (int i = 1; i <= n; ++i) {
if (dp[(1 << n) - 1][i] != INF) {
minim = min(minim, i);
}
}
fout << minim << '\n';
}
return 0;
}