potresti commentare il codice e la varie variabili? Cmq ti consiglierei di aumentare la dimensione del vettore a a 5000 come dicono le condizioni e nei cicli di partire da 0 e finire a n-1. Pero sapendo cosa siano m e f sarebbe piu facile capire il codice
non sono stato troppo a guardare il codice comunque stai dichiarando a con dimensione 1005 e poi lo stai scorrendo fino a n, tuttavia i costraints dicono 1<=N<=5000
#include<iostream>
#include<algorithm>
#include<vector>
#include<math.h>
#include<cstring>
using namespace std;
int f[100005];
int n,m;
int main(){
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
int A[5000], temp[5000];
int K, min=1000001, sum=0;
cin>>n>>K;
for (int i=0; i<n; i++){
cin>>A[i];
if(A[i]<min && A[i]>=K){
min=A[i];
}
else{
sum+=A[i];
}
}
if(min!=1000001 && sum<K){
cout<<min<<endl;
}
else{
int x, j, plus=1;
for(x=0;;x=x+plus){
memset(f,0,100005);
for (int i=0; i<n; i++){
for (j=K+x; j>=A[i]; j--){
f[j]=max(f[j],f[j-A[i]]+A[i]);
}
}
if(f[K+x]>=K)
break;
}
cout<<f[K+x]<<endl;
}
return 0;
}
Questo è il nuovo programma e non so se posso velocizzarlo ancora, perché mi da il 33 testcase come execution timed out, il mio ragionamento è trovare il numero minore o uguale più vicino a K, e se il risultato è minore di K faccio K+1, finché non trovo il risultato. Non sono molto bravo a usare dp, quindi ho dovuto farlo in questo modo, qualcuno ha un suggerimento su come velocizzarlo? Grazie in anticipo.
Ti consiglio di seguire i consigli dati in un’altro forum sullo stesso problema: Pranzo dalla nonna (ottimizazione)
e inoltre per applicare i consigli e’ piu facile usare la ricorsione e una matrice globale