problema de la mochila múltiple (programación dinámica)

Múltiple problema de la mochila

tema:

Hay n tipo de bienes y una capacidad de V. mochila N-i-ésimo mayoría de los artículos miembro [i] está disponible, el costo de cada uno es C [i], es el valor de w [i]. La solución de los elementos en una mochila que permite que el costo total de estos elementos no excede la capacidad de la mochila, y la suma del valor máximo.

 

En primer lugar, el algoritmo básico

Este tema y completamente mochila problema es muy similar. La ecuación básica de la ecuación solo problema por completo la mochila se puede cambiar un poco, porque n [i] 1 para i-th elementos de política especies: tomar 0, tomar la N-1 ...... toma miembro de [i]. Así que F [i] [v] denota el artículo i justo antes en una capacidad máxima de peso de v mochila, hay ecuación de transición de estado:

f[i][v]=max{f[i-1][v-k*c[i]]+k*w[i]|0<=k<=n[i]}

La complejidad es O (V * Σn [i]).

 

código:



#include <iostream>
#include <algorithm>
#define N 1002
using namespace std;

int f[N];
int w[N];
int v[N];
int s[N];

int main() {
    int n,W; cin >> n >> W;
    for(int i=1;i<=n;i++) {
        cin >> w[i] >> v[i] >> s[i];
    }
    for(int i=1;i<=n;i++) {
        for(int j=W;j>=w[i];j--) {
            for(int k=0;k<=s[i] && k*w[i] <=j ;k++) {
                f[j] = max(f[j],f[j-k*w[i]] + k*v[i]);
            }
        }
    }
    cout << f[W] <<endl;
    return 0;
}

 

En segundo lugar, traducido a 01 problema de la mochila

 

Otro buen método de escritura señorita se convierte sustancialmente a la solución de la mochila 01: artículo en el n-i-ésimo [i] mochila miembro de 01 artículos, 01 del problema de la mochila se obtiene para el número de elementos Sigma] n [i], y resuelto directamente, la complejidad todavía es O (V * Σn [i]).

Exactamente lo mismo que una mochila puede reducir la complejidad de la tarde, pero esperamos que se convertirá en 01 problema de la mochila. Siguen considerando pensamiento binario, consideramos que el i-ésimo artículo en un número de elementos, por lo que el problema original en el i-ésimo artículo aconsejable cada estrategia - piezas [M] e 0..n - podía equivalente a varios elementos tomados después miembro de la sustitución. Además, tomar más de n no aparecerá [i] estrategia miembro.

El método es: el i-ésimo elemento en varios artículos, en el que cada elemento tiene un valor de coeficiente de estos elementos y los costes son los costes y el valor original multiplicado por este factor. Estos coeficientes son 1,2,4, ..., 2 ^ (k-1), n ​​[i] -2 ^ k + 1, k y satisfacer n [i] -2 ^ k + 1> 0 el número entero más grande. Por ejemplo, si n [i] es 13, este artículo se puede dividir en cuatro coeficientes de 1,2,4,6 artículos.

Los coeficientes de estos elementos en y es n [i], muestra que n no puede tomar más de la i-ésimo elemento de miembro de [i]. También este método se puede garantizar para cada número entero, se puede utilizar un número de coeficientes 0..n [I] que representa entre, la prueba se puede dividir 0..2 ^ k-1 y 2 ^ k..n [i] dos para analizar los resultados, no es difícil, espero que se trate de pensar por sí mismos.

Tales artículos se pueden dividir en el i-ésimo O (log n [i]) tipo de bienes, la conversión a la complejidad del problema original es O (V * Σlog n [i]) de 01 problema de la mochila, es una gran mejora.

 

El siguiente seudo código dado anteriormente, un método para procesar múltiples artículos de mochila:

MULTIPLEPACK(cost,weight,amount): //其中 amount 表示物品的件数。
/*处理总费用不小于背包容量的物体*/
if cost*amount >= V
    then  COMPLETEPACK(cost,weight)   //当做完全背包问题处理
        return


/*处理总费用小于背包容量的物体*/
int k=1 
while k < amount
    do         
        ZEROONEPACK( k*cost,k*weight )   //做 01 背包算法
        amount = amount - k  //用来保证分成的这几件物品的系数和为n[i]
        k = k*2  //考虑二进制的思想,把第i种物品换成若干件物品
ZEROONEPACK(amount*cost,amount*weight)

 

 

 

Publicados 118 artículos originales · ganado elogios 63 · Vistas a 40000 +

Supongo que te gusta

Origin blog.csdn.net/qq_42185999/article/details/104508424
Recomendado
Clasificación