【HDU1114】 Piggy-Bank (mochila completa)

**

Hucha

**

Límite de tiempo: 2000/1000 MS (Java / otros) Límite de memoria: 65536/32768 K (Java / otros)
Envío total (es): 20204 Envío (es) aceptado (s): 10266

Descripción del problema

Antes de que ACM pueda hacer algo, se debe preparar un presupuesto y obtener el apoyo financiero necesario. Los principales ingresos de esta acción provienen de Irreversiblemente Bound Money (IBM). La idea detrás es simple. Siempre que algún miembro de ACM tiene un poco de dinero, toma todas las monedas y las arroja a una alcancía. Sabes que este proceso es irreversible, las monedas no se pueden sacar sin romper el cerdo. Después de un tiempo suficientemente largo, debería haber suficiente dinero en efectivo en la alcancía para pagar todo lo que se deba pagar.

Pero hay un gran problema con las alcancías. No es posible determinar cuánto dinero hay dentro. Así que podríamos romper el cerdo en pedazos solo para descubrir que no hay suficiente dinero. Claramente, queremos evitar esta desagradable situación. La única posibilidad es pesar la alcancía e intentar adivinar cuántas monedas hay dentro. Suponga que podemos determinar el peso del cerdo con exactitud y que conocemos el peso de todas las monedas de una determinada moneda. Entonces hay una cantidad mínima de dinero en la alcancía que podemos garantizar. Su tarea es averiguar este peor de los casos y determinar la cantidad mínima de efectivo dentro de la alcancía. Necesitamos tu ayuda. ¡No más cerdos rotos prematuramente!

Entrada
La entrada consta de T casos de prueba. El número de ellos (T) se da en la primera línea del archivo de entrada. Cada caso de prueba comienza con una línea que contiene dos números enteros E y F. Indican el peso de un cerdo vacío y del cerdo lleno de monedas. Ambos pesos se expresan en gramos. Ningún cerdo pesará más de 10 kg, eso significa 1 <= E <= F <= 10000. En la segunda línea de cada caso de prueba, hay un número entero N (1 <= N <= 500) que da el número de varias monedas utilizadas en la moneda dada. Después de esto hay exactamente N líneas, cada una especificando un tipo de moneda. Estas líneas contienen dos números enteros cada una, Pand W (1 <= P <= 50000, 1 <= W <= 10000). P es el valor de la moneda en unidades monetarias, W es su peso en gramos.

Salida
Imprime exactamente una línea de salida para cada caso de prueba. La línea debe contener la frase "La cantidad mínima de dinero en la alcancía es X". donde X es la cantidad mínima de dinero que se puede lograr usando monedas con el peso total dado. Si no se puede alcanzar el peso exactamente, imprima una línea “Esto es imposible”.

Entrada de muestra
3
10110
2
1 1
30 50
10110
2
1 1
50 30
1 6
2
10 3
20 4

Salida de muestra
La cantidad mínima de dinero en la alcancía es 60.
La cantidad mínima de dinero en la alcancía es 100.
Esto es imposible.

Fuente
Central Europe 1999

La idea principal del tema: Tienes una alcancía, se te pide que ingreses el peso cuando la alcancía está vacía y el peso cuando el dinero está lleno. Luego ingrese un número n para representar n tipos de mochilas, ingrese su valor y peso.

Análisis: la mochila 01 es algo solo una de cada, cada una completamente mochila Cualquier cantidad de cosas
, ya que la razón por la que la mochila 01 es para revertir max es el valor del estado anterior es dos de
modo que cuando ponemos cuando i de 1 a N ciclo, F [v] representa el valor obtenido cuando la capacidad de v está en el tipo de mochila i anterior, aquí no estamos sumando la mochila anterior, sino la mochila actual. Siempre que el estado de los dos elementos de min esté en orden.

#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"

using namespace std;

const int maxn = 1e4+5;
const int maxnn = 1e3;
const int INF = 999999;

int w[maxnn],v[maxnn];
int dp[maxn];
int T;
int emp,ful,size;
int n;
int min(int a,int b){
    return a<b?a:b;
}

int main(){

    scanf("%d",&T);
    while(T--){
        memset(dp,INF,sizeof(dp));
        dp[0]=0;
        scanf("%d%d",&emp,&ful);
        size = ful-emp;
        scanf("%d",&n);
        for(int i=0 ; i<n ; i++){
            scanf("%d%d",&v[i],&w[i]);
        }
        for( int i=0 ; i<n ; i++ ){
            for( int j=w[i] ; j<=size ; j++ ){
                dp[j]=min(dp[j],dp[j-w[i]]+v[i]);
            }
        }
        if(dp[size]<999999)
        cout<<"The minimum amount of money in the piggy-bank is "<<dp[size]<<"."<<endl;
        else
        cout<<"This is impossible."<<endl;
    }
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/thesprit/article/details/51944978
Recomendado
Clasificación