Je suis un débutant dans la programmation dynamique et j'ai essayé le problème du sac à dos entier ici à SPOJ (http://www.spoj.pl/problems/KNAPSACK/). Cependant, pour les cas de test donnés, ma solution ne donne pas la bonne sortie. Je vous serais reconnaissant si vous pouviez suggérer si la mise en œuvre suivante par moi est correcte. S'il vous plaît noter que la variable back
est pour le retour en arrière, sur lequel je ne suis pas sûr de savoir comment faire. J'espère avoir votre aide dans la mise en œuvre du backtracking aussi. Merci.Résoudre le sac à dos Integer
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <string>
#include <iostream>
using namespace std;
int knapsack(int value[], int weight[], int n, int C,
vector <int>&back)
{
int *M = new int[C + 1];
int k;
int i, j, tmp, pos;
for (i = 1; i <= C; i++) {
M[i] = M[i - 1];
pos = i - 1;
for (j = 0; j < n; j++) {
k = i - weight[j];
if (k >= 0)
tmp = M[k] + value[j];
if (tmp > M[i]) {
M[i] = tmp;
}
}
back.push_back(pos);
}
int ans = M[C];
delete[]M;
return ans;
}
int main()
{
int C, N;
cin >> C >> N;
int* value = new int[N+1];
int* weight = new int[N+1];
for (int i = 0; i <= N; i++) {
cin>>value[i]>>weight[i];
}
vector <int>back(N, 0);
cout<<knapsack(value,weight,N,C,back)<<endl;
return 0;
}
Voici les cas de test d'entrée/sortie correcte:
Input:
4 5
1 8
2 4
3 0
2 5
2 3
Output:
13
Cependant, la sortie que je reçois est 17
.
« Toutefois, pour les cas de test donné ma solution ne donne pas la sortie correcte. » Quelle entrée? Quel résultat considérez-vous correct? et quel résultat avez-vous réellement obtenu? – abelenky
@EitanT: Non, ce n'est pas le cas. – hytriutucx