Pagini recente » Cod sursa (job #111269) | Cod sursa (job #972652) | Cod sursa (job #3189751) | Cod sursa (job #2698940) | Cod sursa (job #761424)
Cod sursa(job #761424)
#include <stdio.h>
#include <stdlib.h>
/* return maximum profit
* s.t. total weight does not exceed maxW */
int knapsack(int n, int maxW, int* w, int* p) {
int m[maxW + 1][n];
int g, i, j;
for (g = 0; g <= maxW; g++)
for (i = 0; i < n; i++) {
m[g][i] = (w[i] <= g) ? p[i] : 0;
}
for (g = 0; g <= maxW; g++)
for (i = 0; i < n; i++) {
if (w[i] < g)
for (j = 0; j < i; j++) {
if (m[g-w[i]][j] + p[i] > m[g][i])
m[g][i] = m[g-w[i]][j] + p[i];
}
}
return m[maxW][n-1];
}
int main() {
freopen("rucsac.in", "r", stdin);
freopen("rucsac.out", "w+", stdout);
int n, maxW; //n = num obj; maxW = max weight
int *w, *p; //w = weight; p = profit
int i;
scanf("%d %d", &n, &maxW);
w = malloc(n * sizeof(int));
p = malloc(n * sizeof(int));
for (i = 0; i < n; i++) {
scanf("%d %d", &w[i], &p[i]);
}
printf("%d", knapsack(n, maxW, w, p));
free(w);
free(p);
return 0;
}