"CTSC1997" Curso

Descripción

Cada estudiante, con el fin de lograr un cierto créditos debe ser seleccionado entre los muchos cursos en la universidad para estudiar en algunos cursos, algunos cursos deben estar antes de que algunos de los cursos en el plan de estudios, tales como las matemáticas siempre aprender antes de cualquier otro curso. Hay N de cursos, cada curso hay créditos de cada curso o no hay una directa Requisito previo (si el curso es un curso que b único requisito previo de un programa de estudios terminados, con el fin de aprender el supuesto b). Estos cursos donde un estudiante elegir los cursos de la puerta y le pidió M para obtener el crédito máximo es la cantidad?

Entrada

La primera línea tiene dos enteros N, M separadas por un espacio. (1≤N≤300,1≤M≤300)

Las siguientes N filas, la primera fila I + 1 contiene dos números enteros K I y S I , K I denota Requisito previo dirigir el curso de I, S representa I de créditos de curso. Si ki = 0 indica que no hay directa Requisito (1≤k I ≤N, 1≤S I ≦ 20).

Salida

Sólo una línea, elegir cursos M puntuación máxima.

Solución

Requisito previo Desde cada curso es a lo sumo uno (correspondiente a cada nodo en el árbol a lo sumo un nodo padre), por lo que este N formar una estructura de bosque curso (un número de árboles, ya que puede haber más de una Requisito previo supuesto que no). Para simplificar, podemos crear un "clases virtuales" ha sido --0 nodos, como requisito previo "prácticamente no hay requisitos previos, por supuesto", que contiene N nodos en un bosque que contiene los N + 1 nodo del árbol, donde 0 es el nodo raíz.

Set F [x] [t] representa la t máximo de crédito seleccionado por supuesto se puede obtener en el subárbol con raíz en x, donde x es el sub-nodo se establece Son (x), el número de puntos de nodo secundario p = | Son ( x) |. Después de la terminación del curso x, para cada sub-nodo de y∈Son x (x), podemos electiva subárbol con raíces en y en diversos cursos (referidos como C I ), satisfaciendo [Sigma CI = T obtener la mayor cantidad de crédito sobre la base de -1.

Cuando t = 0, claramente f [x] [t] = 0. Cuando t> 0, el análisis anterior, la ecuación de transición de estado es el siguiente:

$ F [x] [t] = max {\ sum_ {i = 1} ^ {p} f [y_i] [C_I]} + puntuación de $ [x]

Debe satisfacer  $ \ sum_ {i = 1} ^ {p} = C_I t-1 $

Esta ecuación es en realidad un modelo de agrupación mochila (adivinar). Hay P = | Son (x) | grupo de elementos, cada elemento tiene t-1, el volumen de la j-ésimo elemento en el que J es el i-ésimo grupo, el valor de f [y] [j], el volumen total de la mochila t-1. Se seleccionaron de cada grupo de no más de un artículo (cada nodo hijo y sólo se puede elegir un estado a x), de tal manera que el artículo no supera el volumen de la premisa de t-1 (después de la finalización de x, sino también para electiva t-1 curso), la suma del valor máximo de la mercancía (para sacar el máximo de crédito). Por supuesto, x = 0 es un caso especial, ya que el nodo raíz virtual en realidad no tiene por qué ser electiva, esta vez debe ser el volumen total de la mochila como t. Hemos estado del árbol con mochila DP transferencia de paquetes.

De acuerdo con este enfoque folla clic en la CA que mi prostituta blanca

código

Poner un par de código extraño

1 #include <. Bits / STDC ++ h>
 2  #define int largo, largo
 3  usando  espacio de nombres std;
4  const  int N = 310 ;
5  int n, m, x, f [N] [N], s [N];
6 vector < int > hijo [N];
7  void dp ( int x) {
 8      f [x] [ 0 ] = 0 ;
9      para ( int i = 0 ; i <hijo [x] .size (); i ++ ) {
 10          int y = hijo [x] [i]; dp (y);
11         para ( int t = m; t> = 0 ; t-- )
 12              para ( int j = t; j> = 0 ; j-- )
 13                  f [x] [t] = max (f [x] [t ], f [x] [tj] + f [y] [j]);
14      }
 15      Si (x =! 0 ) para ( int t = m; t> 0 ; t--) f [x] [t] = f [x] [t- 1 ] + s [x];
16  }
 17  firmado main () {
 18      // freopen ( "r", la entrada estándar "en".);
19      // freopen ( "w", stdout "fuera".); 
20     scanf ( " % LLD% LLD " , y n, y m);
21      para ( int i = 1 ; i <= n; i ++ ) {
 22          scanf ( " % LLD% LLD " , y x, y s [i]);
23          hijo [x] .push_back (i);
24      }
 25      dp ( 0 ), printf ( " % LLD \ n " , f [ 0 ] [m]);
26      de retorno  0 ;
27 }

 Esto no es dp árbol de konjac, la bienvenida a mal correcta

Por cierto: los maestros DU mejores en el mundo

Supongo que te gusta

Origin www.cnblogs.com/maoyiting/p/12555368.html
Recomendado
Clasificación