Es un problema de programación dinámica y la recursividad con la memorización es la forma más fácil de resolver ese problema.
Cosas a tener en cuenta:
- forma de alcanzar un camino ponderado con un borde de peso al menos d .
- Tiene un conjunto continuo de aristas hasta K en cada nodo.
- peso requerido N
formato de memo dp [peso actual] [First_Condition_Truth]
- ¿Cómo se debe aprender la codificación, haciendo algoritmos, desde el nivel básico, dado que no tiene experiencia en codificación? (especialmente desde el punto de vista de la colocación y también dado el hecho de que me queda un año para que comience mi temporada de colocación).
- ¿Cuál es el algoritmo detrás de Facebook Newsfeed?
- Cómo planificar 1-2 años de programación para convertirse en un experto en algoritmos, suponiendo que tenga un conocimiento de C ++ en la escuela secundaria
- ¿Qué tipo de estrategias y algoritmos tenemos en el comercio cuantitativo?
- ¿Puede mostrar que la ordenación por fusión tiene complejidad de tiempo [matemática] O (n \ log n) [/ matemática]?
First_Condition_Truth: cero para la primera condición falsa y viceversa.
Función (Current_Weight_Of_Path, First_Condition_Truth)
Caso base: ha tomado al menos un borde de peso do mayor y ha alcanzado el peso deseado, establezca dp [Current_Weight_Of_Path] [First_Condition_Truth] igual a 1 y regrese.
De lo contrario: almacene la suma de funciones después de tomar cada borde de 1 a k hasta que la adición al peso sea menor que el peso requerido (N), y si el borde tomado es mayor que igual a d establezca First_Condition_Truth en 1 y luego vuelva a aparecer. Almacene y devuelva esta suma.
ll resolver (ll cur_w, ll estado) {
if (dp [cur_w] [estado]! = – 1)
return dp [cur_w] [estado];
si no (cur_w> n)
dp [cur_w] [estado] = 0;
si no (cur_w == n && state)
dp [cur_w] [estado] = 1;
más {
ll ret = 0;
para (ll i = 1; i <= k; i ++)
if (cur_w + i = d)? 1: 0)), ret% = MOD;
dp [cur_w] [estado] = ret;
}
return dp [cur_w] [estado];
}
/ **** El comienzo de la recursión y el resultado final: se pondrá en Main () ** /
para (int i = 1; i <= k; i ++) {
ret + = resolver (i, (i> = d)? 1: 0);
ret% = MOD;
}