El significado de los problemas: el significado de la pregunta sencilla las preguntas; es simplemente A, B y 1 unidad 10, $ 100, $ 1,000. . . . Votos en la cantidad de papel moneda, y así toda la potencia de 10, y ahora pagan B A, que pidió el número de dinero en juego es al menos la cantidad de dinero se puede pagar.
Solución: La solución al problema del título oficial es DP + recursiva se veía desde hace mucho tiempo, comentarios en el código da su propia comprensión,
. 1 #include <la iostream> 2 #include <stdio.h> 3. #Include <CString> 4. El uso de espacio de nombres STD; 5. Int DP [ 10005 ] [ 2 ]; // dp [i] [J]: Cuando como dp [i ] [0] indica el tH I-datos dígitos empujados, mientras que esto representa un valor monetario o el más bajo . 6 // DP [i] [. 1] indica los i-bits de datos para empujar, si bien representa una valor monetario del valor mínimo de los datos representados por 1 7 // tal, los datos 83, dp [1] [0 ] está representado por 80, y el DP de datos [1] [1] está representado por 90 . 8 int main () { . 9 Char PTR [ 100,005 ]; 10 Scanf ( " % S " , PTR + 1.); 11 / * inicialización de datos 12 * 0 cuando los primeros datos se empuja a la vez, cuando se indica, DP [0] [0] representa el número 0, pero esta vez, sólo necesitan ser facturas 0 lo harán representado 13 * dp [0] [1] representa los datos de los bits 0 ª de los datos, de acuerdo con la definición anterior, los datos que representa 1, de las preguntas, que necesitamos un billete de $ 1 puede expresarlo borrar 14 * / 15 DP [ 0 ] [ 0 ] = 0 ; 16 DP [ 0 ] [ 1. ] = 1. ; . 17 int len = strlen (PTR + 1. ); 18 es / * cada dato de bits que representan la cantidad de dinero tiene dos tipo de formas de pago: 19 más que decir, lo he entendido $ 8, la primera forma es directamente a los ocho billetes de un dólar para pagar 20 segunda manera es dedicar $ 10 para encontrar dos $ 1 , con un total de tres notas, 21 Estos son dos formas de dar dinero y la siguiente es para atravesar cada dígito, la mayor cantidad de dinero en el número de hojas determinado a borrar cada dígito de 22 después de sumar a 23 * / 24 para ( int i = 1 ; I <= len; i ++) { // comienzo a un ciclo a través de datos 25 DP [I] [ 0 ] = min (DP [I- 1. ] [ 0 ] + (PTR [I] - ' 0 ' ) / * representa directamente a la * / , DP [I- 1. ] [ 1. ] + 10 - (PTR [I] - ' 0 ' ) / * por ejemplo, tengo este * / ); 26 DP [I] [ 1. = Min (DP [I-] 1. ] [ 0 ] + (PTR [I] - ' 0 ' ) + 1. , DP [I- 1. ] [ 1. ] + 10 - (PTR [I] - ' 0 ' -) 1 ); 27 / * número de datos necesarios aquí ¿por qué pagar dinero para el asiento 1 representado actualmente por Zhang? Creo que sí, aquí se trata de un proceso recursivo, cuando i == 1, que se encuentra aquí más el número mínimo de hojas momento, cuando i == 2 cuando esto se convierte en más que un aumento mínimo de 10 el número de hojas 10 28 * calculado a través de dichas capas hacia fuera, dp [i] [0] siempre se almacena en el número mínimo requerido actualmente por hojas de dinero. 29 * / 30 } 31 es tribunal << DP [len] [ 0 ] << endl; 32 de retorno 0 ; 33 }