Cod sursa(job #2922632)

Utilizator euyoTukanul euyo Data 9 septembrie 2022 11:40:18
Problema Zebughil Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <bits/stdc++.h>

using namespace std;

using ll = long long;

ifstream fin( "zebughil.in" );
ofstream fout( "zebughil.out" );

const int MAXN = 18;
const int INF = 1e9;

int v[MAXN];
int dp[1 << MAXN], res[1 << MAXN];

int main() {
  int n, g;

  for ( int _ = 0; _ < 3; ++_ ) {
    fin >> n >> g;
    for ( int i = 0; i < n; ++i ) {
	  fin >> v[i];
    }
	for ( int q = 1; q < (1 << n); ++q ) {
	  dp[q] = 0;
	  res[q] = INF;
	}
	res[0] = 1;
    for ( int mask = 1; mask < (1 << n); ++mask ) {
	  for ( int i = 0; i < n; ++i ) {
		if ( mask & (1 << i) ) {
		  if ( v[i] + dp[mask ^ (1 << i)] <= g ) {
			if ( res[mask ^ (1 << i)] < res[mask] || (res[mask ^ (1 << i)] == res[mask] && dp[mask ^ (1 << i)] + v[i] < dp[mask]) )  {
			  dp[mask] = dp[mask ^ (1 << i)] + v[i];
			  res[mask] = res[mask ^ (1 << i)];
			}
		  } else {
		    if ( res[mask ^ (1 << i)] + 1 < res[mask] || (res[mask ^ (1 << i)] + 1 == res[mask] && v[i] < dp[mask]) )  {
			  dp[mask] = v[i];
			  res[mask] = res[mask ^ (1 << i)] + 1;
			}
		  }
		}
	  }
	}
	fout << res[(1 << n) - 1] << "\n";
  }
  fin.close();
  fout.close();
  return 0;
}