Cod sursa(job #3143639)

Utilizator NanuGrancea Alexandru Nanu Data 1 august 2023 10:18:31
Problema Zebughil Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <fstream>
#include <vector>
using namespace std;

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

const int DIM = 17;

int n, g;
int v[DIM + 5];
int dp[(1LL << (DIM + 1))][DIM + 2];

//dp[i][j] = cate produse pot transporta cu i camioane;
static inline void Solve() {
  fin >> n >> g;
  for(int i = 0; i < n; i++)
    fin >> v[i];
  
  for(int j = 0; j <= (1LL << n); j++)
    for(int i = 1; i <= n; i++)
      dp[j][i] = 0;
  
  for(int i = 0; i < n; i++)   //initial fiecare camion transporta cate un produs;
    dp[(1 << i)][1] = v[i];
  
  for(int j = 1; j < (1LL << n); j++)     //pot folosi maxim n camioane;
    for(int i = 1; i <=  n; i++) {
      if(dp[j][i] == 0)
        continue;

      for(int k = 0; k < n; k++) {
        int mask = (1LL << k);
        if((mask & j) == 0) {               //nu am transportat produsul k in camionul i;
          if(dp[j][i] + v[k] <= g)
            dp[j | mask][i] = max(dp[j | mask][i], v[k] + dp[j][i]);
          else dp[j | mask][i + 1] = max(v[k], dp[j | mask][i + 1]);
        }
      }
    }

  for(int i = 1; i <= n; i++)
    if(dp[(1LL << n) - 1][i]) {
      //fout << dp[(1LL << n) - 1][i] << " ";
      fout << i;
      break;
    }
  fout << '\n';
}

int main() {
  for(int i = 1; i <= 3; i++) 
    Solve();

  return 0;
}