Festa della frutta#11161

Festa della frutta (Editoriale)

C'è uno zaino di capacità . Sono disponibili due oggetti con valori e . Ciascuno di essi può essere messo nello zaino un numero arbitrario di volte. Risolviamo il problema dello zaino per due oggetti.

Sia dp[i] = 1 se Bessie può ottenere una sazietà pari a . Ora Bessie beve dell'acqua. Precisamente, per ogni valore per cui dp[i] = 1, impostiamo dp[i / 2] = 1.

Ora risolviamo di nuovo il problema dello zaino per due oggetti. Troviamo le sazietà che Bessie potrà raggiungere dopo aver bevuto l'acqua.

Esempio

Consideriamo l'esempio fornito. Risolviamo il problema dello zaino per arance e limoni.

Bessie beve dell'acqua.

Risolviamo di nuovo il problema dello zaino per arance e limoni.

La sazietà massima di Bessie è pari a .

Implementazione dell'algoritmo

Dichiariamo un array , in cui dp[i] = 1 se Bessie può ottenere una sazietà pari a .

#define MAX 5000001
int dp[MAX];

Leggiamo i dati di input.

scanf("%d %d %d", &t, &a, &b);

Inizializziamo lo zaino: la sazietà può essere raggiunta se non si mangia nulla.

dp[0] = 1;

Mettiamo le arance nello zaino.

for (i = a; i <= t; i++)
  if (dp[i - a] == 1) dp[i] = 1;

Mettiamo i limoni nello zaino.

for (i = b; i <= t; i++)
  if (dp[i - b] == 1) dp[i] = 1;

Bessie beve dell'acqua. Se la sazietà è raggiungibile, allora anche la sazietà è raggiungibile.

for (i = 1; i <= t; i++)
  if (dp[i] == 1) dp[i / 2] = 1;

Risolviamo di nuovo il problema dello zaino per arance e limoni.

for (i = a; i <= t; i++)
  if (dp[i - a] == 1) dp[i] = 1;
for (i = b; i <= t; i++)
  if (dp[i - b] == 1) dp[i] = 1;

Troviamo e stampiamo la sazietà massima che Bessie può raggiungere.

for (i = t; i > 0; i--)
  if (dp[i] == 1) break;
printf("%d\n", i);

Implementazione in Python

Leggiamo i dati di input.

t, a, b = map(int, input().split())

Dichiariamo un array , in cui dp[i] = 1 se Bessie può ottenere una sazietà pari a .

dp = [0] * (t + 1)

Inizializziamo lo zaino: la sazietà può essere raggiunta se non si mangia nulla.

dp[0] = 1

Mettiamo le arance nello zaino.

for i in range(a, t + 1):
  if dp[i - a] == 1: dp[i] = 1

Mettiamo i limoni nello zaino.

for i in range(b, t + 1):
  if dp[i - b] == 1:  dp[i] = 1

Bessie beve dell'acqua. Se la sazietà è raggiungibile, allora anche la sazietà è raggiungibile.

for i in range(1, t + 1):
  if dp[i] == 1: dp[i // 2] = 1

Risolviamo di nuovo il problema dello zaino per arance e limoni.

for i in range(a, t + 1):
  if dp[i - a] == 1: dp[i] = 1
for i in range(b, t + 1):
  if dp[i - b] == 1: dp[i] = 1

Troviamo e stampiamo la sazietà massima che Bessie può raggiungere.

for i in range(t, 0, -1):
  if dp[i] == 1: break
print(i)