Perché istanzi più volte Scanner verso System.in? Lo detto un sacco di volte sul forum ultimamente. La creazione di un Scanner connesso a System.in va fatta UNA volta sola all'interno della applicazione.
Perché invochi 2 volte riempiZaino?
codice:
riempiZaino(lista,capmax);
int[]valoridiritorno= riempiZaino(lista,capmax);
Perché non incapsuli la gestione dello "zaino" (l'array e la somma) in una apposita classe? Non solo verrebbe più "pulito" ma ridurresti la logica nella tua parte principale.
Se non è proibito dall'esercizio .. ovviamente.