Soy nuevo en la programación dinámica y he intentado con el problema entero de la mochila aquí en SPOJ (http://www.spoj.pl/problems/KNAPSACK/). Sin embargo, para los casos de prueba dados, mi solución no está dando el resultado correcto. Le estaría agradecido si pudiera sugerir si la siguiente implementación por mí es correcta. Tenga en cuenta que la variable back
es para retroceder, sobre la que no estoy seguro de cómo hacerlo. Espero contar con tu ayuda para implementar el backtracking también. Gracias.Resolviendo la mochila entera
#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;
}
Éstos son los casos de prueba correctos de entrada/salida:
Input:
4 5
1 8
2 4
3 0
2 5
2 3
Output:
13
Sin embargo, la salida que estoy recibiendo es 17
.
"Sin embargo, para los casos de prueba dado mi solución no está dando la salida correcta." ¿Qué entrada? ¿Qué producción consideras correcta? y ¿qué producción obtuviste en realidad? – abelenky
@EitanT: No, no es así. – hytriutucx