Dado un array coinValue con las denominaciones de las monedas, de tamaño N:
private static int N = 5;
private static int[] coinValue = new int[] {1, 5, 10, 25, 50};
private static int[][] memo = new int[6][7500]; //Inicializar a -1
private static int ways(int type, int value) {
}
private static int N = 5;
private static int[] coinValue = new int[] {1, 5, 10, 25, 50};
private static int[][] memo = new int[6][7500]; //Inicializar a -1
private static int ways(int type, int value) {
if (value == 0) return 1;
if (value < 0 || type == N) return 0;
}
private static int N = 5;
private static int[] coinValue = new int[] {1, 5, 10, 25, 50};
private static int[][] memo = new int[6][7500]; //Inicializar a -1
private static int ways(int type, int value) {
if (value == 0) return 1;
if (value < 0 || type == N) return 0;
return ways(type + 1, value) + ways(type, value - coinValue[type]);
}
private static int N = 5;
private static int[] coinValue = new int[] {1, 5, 10, 25, 50};
private static int[][] memo = new int[6][7500]; //Inicializar a -1
private static int ways(int type, int value) {
if (value == 0) return 1;
if (value < 0 || type == N) return 0;
if (memo[type][value] != -1) return memo[type][value];
memo[type][value] = ways(type + 1, value) + ways(type, value - coinValue[type]);
return memo[type][value];
}
private static int N = 5, M = 12;
private static int[] coinValue = new int[] {1, 5, 10, 25, 50};
private static int[][] memo = new int[N][M];
public static void ways() {
for(int i = N - 1; i >= 0; i--) { // i = tipo actual
for(int j = 0; j < M; j++) { // j = valor actual
}
}
}
private static int N = 5, M = 12;
private static int[] coinValue = new int[] {1, 5, 10, 25, 50};
private static int[][] memo = new int[N][M];
public static void ways() {
for(int i = N - 1; i >= 0; i--) { // i = tipo actual
for(int j = 0; j < M; j++) { // j = valor actual
if (j == 0) {
memo[i][j] = 1;
}
}
}
}
private static int N = 5, M = 12;
private static int[] coinValue = new int[] {1, 5, 10, 25, 50};
private static int[][] memo = new int[N][M];
public static void ways() {
for(int i = N - 1; i >= 0; i--) { // i = tipo actual
for(int j = 0; j < M; j++) { // j = valor actual
if (j == 0) {
memo[i][j] = 1;
} else {
int valor1 = 0, valor2 = 0, _i, _j;
// Calculamo valor1, es decir, posibilidad de no incluir la moneda
_i = i + 1;
_j = j;
if(_i < N) valor1 = memo[_i][_j];
}
}
}
}
private static int N = 5, M = 12;
private static int[] coinValue = new int[] {1, 5, 10, 25, 50};
private static int[][] memo = new int[N][M];
public static void ways() {
for(int i = N - 1; i >= 0; i--) { // i = tipo actual
for(int j = 0; j < M; j++) { // j = valor actual
if (j == 0) {
memo[i][j] = 1;
} else {
int valor1 = 0, valor2 = 0, _i, _j;
// Calculamo valor1, es decir, posibilidad de no incluir la moneda
_i = i + 1;
_j = j;
if(_i < N) valor1 = memo[_i][_j];
// Calculamos valor2, es decir, posibilidad de incluir la moneda
_i = i;
_j = j - coinValue[_i];
if(_j >= 0) valor2 = memo[_i][_j];
}
}
}
}
private static int N = 5, M = 12;
private static int[] coinValue = new int[] {1, 5, 10, 25, 50};
private static int[][] memo = new int[N][M];
public static void ways() {
for(int i = N - 1; i >= 0; i--) { // i = tipo actual
for(int j = 0; j < M; j++) { // j = valor actual
if (j == 0) {
memo[i][j] = 1;
} else {
int valor1 = 0, valor2 = 0, _i, _j;
// Calculamo valor1, es decir, posibilidad de no incluir la moneda
_i = i + 1;
_j = j;
if(_i < N) valor1 = memo[_i][_j];
// Calculamos valor2, es decir, posibilidad de incluir la moneda
_i = i;
_j = j - coinValue[_i];
if(_j >= 0) valor2 = memo[_i][_j];
memo[i][j] = valor1 + valor2;
}
}
}
// No retorno
}
Dada una cantidad V de centavos, y una lista de n monedas existentes, determinar cual es la mínima cantidad de monedas que debe usarse para completar V.
INTEGER monedas[]
INTEGER change(INTEGER k) {
IF (k == 0)
RETURN 0
IF (k < 0)
RETURN INF
INTEGER rta = INF
FOR i IN RANGE[0, n - 1]
rta = MIN(rta, change(k - monedas[i]))
RETURN rta + 1
}
INTEGER monedas[n]
INTEGER memo[n] //Se inicializa en -1 o NULL
INTEGER change(INTEGER k) {
IF (k == 0)
RETURN 0
IF (k < 0)
RETURN INF
INTEGER rta = INF
FOR i IN RANGE[0, n - 1]
rta = MIN(rta, change(k - monedas[i]))
RETURN rta + 1
}
INTEGER monedas[n]
INTEGER memo[MAX]
INTEGER change(INTEGER k) {
IF (k == 0)
RETURN 0
IF (k < 0)
RETURN INF
IF (memo[k] != -1)
RETURN memo[k]
INTEGER rta = INF
FOR i IN RANGE[0, n - 1]
rta = MIN(rta, change(k - monedas[i]))
RETURN rta + 1
}
INTEGER monedas[n]
INTEGER memo[MAX]
INTEGER change(INTEGER k) {
IF (k == 0)
RETURN 0
IF (k < 0)
RETURN INF
IF (memo[k] != -1)
RETURN memo[k]
INTEGER rta = INF
FOR i IN RANGE[0, n - 1]
rta = MIN(rta, change(k - monedas[i]))
memo[k] = rta + 1
RETURN rta + 1
}
Dada una mochila con una capacidad W, y n productos, donde cada producto tiene un peso wi y un valor vi, calcular el mayor valor que puede introducirse en la mochila, sin exceder su capacidad.
Dados:
INTEGER N //Numero de objetos
INTEGER prices[] //precios de cada producto
INTEGER weights[] //pesos de cada producto
INTEGER knapsack(INTEGER id, INTEGER w) {
IF (id == N || w == 0)
RETURN 0
IF (weights[id] > w)
RETURN knapsack(id + 1, w)
ELSE
RETURN MAX(knapsack(id + 1, w), prices[id] + knapsack(id + 1, w - weights[id]))
}
Añadimos tabla DP
INTEGER N //Numero de objetos
INTEGER prices[] //precios de cada producto
INTEGER weights[] //pesos de cada producto
INTEGER memo[][] //DEBE INICIALIZARSE EN -1 y/o null
INTEGER knapsack(INTEGER id, INTEGER w) {
IF (id == N || w == 0)
RETURN 0
IF (weights[id] > w)
RETURN knapsack(id + 1, w)
ELSE
RETURN MAX(knapsack(id + 1, w), prices[id] + knapsack(id + 1, w - weights[id]))
}
Verificamos si el problema ya se precalculó
INTEGER N //Numero de objetos
INTEGER prices[] //precios de cada producto
INTEGER weights[] //pesos de cada producto
INTEGER memo[][]
INTEGER knapsack(INTEGER id, INTEGER w) {
IF (id == N || w == 0)
RETURN 0
IF (memo[id][w] != -1)
RETURN memo[id][w]
IF (weights[id] > w)
RETURN knapsack(id + 1, w)
ELSE
RETURN MAX(knapsack(id + 1, w), prices[id] + knapsack(id + 1, w - weights[id]))
}
Precalculamos y guardamos
INTEGER N //Numero de objetos
INTEGER prices[] //precios de cada producto
INTEGER weights[] //pesos de cada producto
INTEGER memo[][]
INTEGER knapsack(INTEGER id, INTEGER w) {
IF (id == N || w == 0)
RETURN 0
IF (memo[id][w] != -1)
RETURN memo[id][w]
IF (weights[id] > w)
memo[id][w] = knapsack(id + 1, w)
ELSE
memo[id][w] = MAX(knapsack(id + 1, w), prices[id] + knapsack(id + 1, w - weights[id]))
}
Precalculamos y guardamos
INTEGER N //Numero de objetos
INTEGER prices[] //precios de cada producto
INTEGER weights[] //pesos de cada producto
INTEGER memo[][]
INTEGER knapsack(INTEGER id, INTEGER w) {
IF (id == N || w == 0)
RETURN 0
IF (memo[id][w] != -1)
RETURN memo[id][w]
IF (weights[id] > w)
memo[id][w] = knapsack(id + 1, w)
ELSE
memo[id][w] = MAX(knapsack(id + 1, w), prices[id] + knapsack(id + 1, w - weights[id]))
RETURN memo[id][w]
}