En un proyecto actual, las personas pueden solicitar los productos entregados a su puerta y elegir 'pago contra entrega' como una opción de pago. Para asegurarse de que el repartidor tenga suficiente cambio, se le pide a los clientes que ingresen el monto que pagarán (por ejemplo, la entrega es 48,13, pagarán con 60, - (3 * 20, -)). Ahora, si dependiera de mí, lo convertiría en un campo libre, pero aparentemente los altos mandos decidieron que debería ser una selección basada en las denominaciones disponibles, sin dar cantidades que darían como resultado un conjunto de denominaciones que podría ser más pequeño.Algoritmo montos posibles (sobre) pagados por un precio específico, según las denominaciones
Ejemplo:
denominations = [1,2,5,10,20,50]
price = 78.12
possibilities:
79 (multitude of options),
80 (e.g. 4*20)
90 (e.g. 50+2*20)
100 (2*50)
Es internacional, por lo que las denominaciones podrían cambiar, y el algoritmo debe basarse en esa lista.
Lo más cerca que he llegado que parece funcionar es la siguiente:
for all denominations in reversed order (large=>small)
add ceil(price/denomination) * denomination to possibles
baseprice = floor(price/denomination) * denomination;
for all smaller denominations as subdenomination in reversed order
add baseprice + (ceil((price - baseprice)/subdenomination) * subdenomination) to possibles
end for
end for
remove doubles
sort
Es parece a trabajar, pero esto ha surgido después de tratar violentamente todo tipo de algoritmos compactos, y no puedo defender qué funciona, lo que podría llevar a que algunos países nuevos o de vanguardia obtengan opciones incorrectas, y genera algunas cantidades importantes de dobles.
Como esto probablemente no es un problema nuevo, y Google et al. No pude darme una respuesta, salvo por un montón de páginas que calculan cómo hacer un cambio exacto. Pensé que podría preguntar SO: ¿Ya resolvió este problema? ¿Qué algoritmo? ¿Alguna prueba de que siempre funcionará?
1 por cuestionar su solución antes de comprometerse que –
¿Puedo decir que si los "bienes" son algo parecido a las pizzas, es probable que esta manera de pensar demasiado? (¡Pregunta de algoritmo interesante sin embargo ... continúe!) –
Oye, no elegí pensarlo demasiado, estaba perfectamente preparado para convertir cualquier cosa en un campo de entrada en entero y dejar que los clientes lidiaran con extravagantes brainfarts de su parte ellos mismos :) Me hubiera tomado aproximadamente 2 minutos, en lugar de 3 horas y una multitud de tácticas fallidas :) Desafié la tarea, no pude ganar el argumento, y ahora tengo que vivir con eso debido a mi falta de persuasión ... – Wrikken