# Aiuto per Pranzo dalla nonna (ois\_nonna)

**URL:** <https://forum.olinfo.it/t/aiuto-per-pranzo-dalla-nonna-ois-nonna/9831>\
**Category:** Aiuto\
**Created:** [2 Gennaio 2026, 1:43pm UTC](https://forum.olinfo.it/t/aiuto-per-pranzo-dalla-nonna-ois-nonna/9831 "2026-01-02T13:43:52Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![ahbel\_d3v](https://forum.olinfo.it/user_avatar/forum.olinfo.it/ahbel_d3v/32/3225_2.png) [@ahbel\_d3v](https://forum.olinfo.it/u/ahbel_d3v)\
**Post date:** [2 Gennaio 2026, 1:43pm UTC](https://forum.olinfo.it/t/aiuto-per-pranzo-dalla-nonna-ois-nonna/9831/1 "2026-01-02T13:43:52Z")

</div>

E’ da un po’ di tempo che sto provando a risolvere il problema “Pranzo dalla Nonna”, il punteggio massimo che sono riuscito ad ottenere è di 80/100, sbagliando completamente la subtask numero 5. Qualcuno mi può aiutare?

 ![image](https://forum.olinfo.it/uploads/default/original/2X/9/9db425ac235b328cae2796170bdfed2a97f07ab8.png)

Ecco il mio codice:

```cpp
#include <stdio.h>
#include <iostream>
#include <cstring>
#include <assert.h>

using namespace std;

#define MAXN 5000
#define MAXK 5000
#define MAXP 1000000

int dp[MAXN][MAXK];
int P[MAXN];
int N, K;

int mangia(int porz, int mang, int P[]) {

    if (mang >= K) return mang;
    if (porz == N) return mang;

    if (dp[porz][mang] != -1) return dp[porz][mang];

    dp[porz][mang + P[porz]] = mangia(porz + 1, mang + P[porz], P);
    
    dp[porz][mang] = mangia(porz + 1, mang, P);

    dp[porz][mang] = min(dp[porz][mang + P[porz]], dp[porz][mang]);

    if (dp[porz][mang] < K) { dp[porz][mang] = max(dp[porz][mang + P[porz]], dp[porz][mang]); }

    return dp[porz][mang];

}

int main() {

    ios::sync_with_stdio(false);
    cin.tie(nullptr); cout.tie(nullptr);
    memset(dp, -1, sizeof(dp));

    FILE *fr, *fw;
    int i;

    fr = fopen("input.txt", "r");
    fw = fopen("output.txt", "w");

    //cin >> N >> K;
    assert(2 == fscanf(fr, "%d %d", &N, &K));

    for(i = 0; i < N; i++) {

        //cin >> P[i];
        assert(1 == fscanf(fr, "%d", &P[i]));

    }

    //cout << mangia(0, 0, P);
    fprintf(fw, "%d\n", mangia(0, 0, P));

    fclose(fr);
    fclose(fw);

    return 0;

}

```

Grazie mille in anticipo!

---

<div class="post-metadata">

**Author:** ![ahbel\_d3v](https://forum.olinfo.it/user_avatar/forum.olinfo.it/ahbel_d3v/32/3225_2.png) [@ahbel\_d3v](https://forum.olinfo.it/u/ahbel_d3v)\
**Post date:** [2 Gennaio 2026, 5:05pm UTC](https://forum.olinfo.it/t/aiuto-per-pranzo-dalla-nonna-ois-nonna/9831/2 "2026-01-02T17:05:48Z")

</div>

ho risolto!, il problema stava qua:

```auto
dp[porz][mang + P[porz]] = mangia(porz + 1, mang + P[porz], P);
dp[porz][mang] = mangia(porz + 1, mang, P);

```

Qua sto scrivendo su una cella che “non abbiamo ancora visitato”.

Quindi la funzione mangia corretta è:

```auto
int mangia(int porz, int mang, int P[]) {

    if (mang >= K) return mang;
    if (porz == N) return mang;

    if (dp[porz][mang] != -1) return dp[porz][mang];

    int prendi= mangia(porz + 1, mang + P[porz], P);
    
    int lascia= mangia(porz + 1, mang, P);

    dp[porz][mang] = min(prendi, lascia);

    if (dp[porz][mang] < K) { dp[porz][mang] = max(prendi, lascia); }

    return dp[porz][mang];

}

```
