Pagini recente » Cod sursa (job #1406751) | porumbelulalb | Cod sursa (job #1673779) | Cod sursa (job #647792) | Cod sursa (job #907406)
Cod sursa(job #907406)
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 18;
const int MAXS = (1 << 17);
long long weight[MAXN];
long long maxSum[MAXS];
int minCount[MAXS];
int main()
{
freopen("zebughil.in", "r", stdin);
freopen("zebughil.out", "w", stdout);
int t = 3;
while (t--) {
int N;
long long max_weight;
scanf("%d %lld", &N, &max_weight);
for (int i = 0; i < N; ++i)
scanf("%lld", &weight[i]);
memset(maxSum, -1, sizeof(maxSum));
memset(minCount, 0, sizeof(minCount));
maxSum[0] = max_weight;
minCount[0] = 1;
int max_num = (1 << N);
for (int i = 1; i < max_num; ++i)
for (int j = 0; j < N; ++j) {
if ((i & (1 << j)) != 0) {
int prev = i ^ (1 << j);
if (maxSum[prev] >= weight[j] &&
(maxSum[i] == -1 || minCount[i] > minCount[prev] ||
minCount[i] == minCount[prev] && (maxSum[prev] - weight[j] > maxSum[i]))) {
maxSum[i] = maxSum[prev] - weight[j];
minCount[i] = minCount[prev];
} else if (maxSum[prev] < weight[j] &&
(maxSum[i] == -1 || minCount[i] > minCount[prev] + 1 ||
minCount[i] == minCount[prev] + 1 && (max_weight - weight[j] > maxSum[i]))) {
maxSum[i] = max_weight - weight[j];
minCount[i] = minCount[prev] + 1;
}
}
}
printf("%d\n", minCount[(1 << N) - 1]);
}
return 0;
}