Pagini recente » Cod sursa (job #2142684) | Cod sursa (job #1340343) | Cod sursa (job #2073899) | Cod sursa (job #1874893) | Cod sursa (job #1044590)
#include <fstream>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
ifstream cin("zebughil.in");
ofstream cout("zebughil.out");
int N, G;
static unsigned int dp[1 << 17];
static unsigned int bst[1 << 17];
static unsigned int sum[1 << 17];
unsigned int z[17];
for (int t = 0;t < 3;t++) {
cin >> N >> G;
for (int i = 0;i < N;i++) {
cin >> z[i];
sum[(1 << i)] = z[i];
}
unsigned int total, sumLeft;
for (int i = 1;i < (1 << N);i++) {
sum[i] = sum[i ^ (i & -i)] + sum[i & -i] > G ? G + 1 : sum[i ^ (i & -i)] + sum[i & -i];
if (sum[i] <= G) {
dp[i] = G - sum[i];
bst[i] = 1;
continue;
}
bst[i] = N + 1;
for (int j = 0;j < N;j++) {
if ((i >> j) & 1) {
total = bst[i ^ (1 << j)];
if ( z[j] > dp[i ^ ( 1<< j)]) {
total++;
sumLeft = G - z[j];
} else {
sumLeft = dp[i ^ (1 << j)] - z[j];
}
if (total < bst[i] || (total == bst[i] && sumLeft > dp[i])) {
bst[i] = total;
dp[i] = sumLeft;
}
}
}
}
cout << bst[(1 << N) - 1] << "\n";
}
return 0;
}