Pagini recente » Cod sursa (job #1182132) | Cod sursa (job #1982812) | Cod sursa (job #2145780) | Cod sursa (job #2164079) | Cod sursa (job #3225925)
#include <stdio.h>
#include <utility>
#define N 17
#define MAX_MASK (1 << N)
#define INF (1 << 30)
#define ll long long
unsigned ll v[N];
std::pair <ll, ll> dp[MAX_MASK];
int n;
int main() {
FILE *fin, *fout;
ll w;
fin = fopen("zebughil.in", "r");
fout = fopen("zebughil.out", "w");
for ( int q = 0; q < 3; q ++ ) {
fscanf(fin, "%d%lld", &n, &w);
for ( int i = 0; i < n; i ++ )
fscanf(fin, "%lld", &v[i]);
ll max_mask = (1LL << n) - 1;
dp[0] = {0, 0};
for ( ll mask = 1; mask <= max_mask; mask ++ ) {
dp[mask] = {0, INF};
for ( int bit = 0; bit < n; bit ++ ) {
if ( ((mask >> bit) & 1) == 1 ) {
ll prev = mask - (1 << bit);
if ( dp[prev].first + v[bit] <= w ) {
if ( dp[prev].second < dp[mask].second )
dp[mask] = {dp[prev].first + v[bit], dp[prev].second};
}
else if ( dp[prev].second + 1 < dp[mask].second )
dp[mask] = {v[bit], dp[prev].second + 1};
}
}
}
fprintf(fout, "%lld\n", dp[max_mask].second + 1);
}
fclose(fin);
fclose(fout);
return 0;
}