agrupación algoritmo problema de la mochila [Aprendizaje]

Hay N artículos V y una capacidad de la mochila, el peso de los elementos de orden i del W [i], el valor de V [i], los elementos están divididos en varios grupos, cada grupo de elementos en conflicto, seleccionados de entre los más uno
preguntó lo que los elementos en la mochila pueden hacer que la mochila para obtener el máximo valor

Para cada grupo de artículos, se puede ver como un problema de la mochila 01, para cada grupo de artículos se pueden procesar de una vez.

Formato de entrada:
primera línea: tres números enteros, V (capacidad de mochila, V <= 200), N ( el número de elementos, N <= 30) y T (número de grupo máxima, T <= 10);
segundo 2 ... N + línea 1: cada línea tres enteros Wi, Vi, p, representa un valor de peso, pertenece al número de grupo de cada elemento.
A partir de la idea de este blog hace referencia
Blog de referencia
si el rendimiento de una matriz bidimensional de formas:

  1. Número de ciclismo en grupo
  2. Seleccione los elementos
  3. ciclo de volumen
    // 二维数组:
    f[k][j]表示前k组体积为j的最大价值
    for(int k=1; k<=T; ++k)            //组别
        for(int i=1; i<=N; ++i)       //物品
            for(int j=V; j>=0; j--)   //体积
                f[k][j] = max(f[k][j], v[k][i]+f[k-1][j-w[k][i]] );  //求组这组最大

En el que, f[k-1][j]refiriéndose a k-1 antes de que el grupo de volúmenes j valor máximo, y por lo tanto v[k][i] + f[k-1][j-w[k][i]]medios: de llevar el aparato actual antes de la + K-1 artículos volumen de grupo i jw [k] (botón [i] izquierda en el volumen de el valor actual del volumen de mercancías) de valor.

A las palabras de una sola dimensión:

  1. El número de paquetes Group
  2. ciclo de volumen
  3. El recorrido de los bienes
    // 一维数组 :f[j]表示体积为j的时候的最大价值!(每组都共用一个dp数组,dp数组保存最大价值)
    for(int k=1; k<=T;k++)
        for(int j=V; j>=0; j--)   //分组体积
            for(int i=1; i<=a[k][0]; i++){  //对体积里的每个物品
                int x = a[k][i]; //x来记录物品编号
                if(j>=w[i])  //容量大于第i个物品的体积
                    f[j] = max(f[j], v[x]+f[j-w[x]] ); //价值为
            }

Entre ellos, el siguiente General tomó la forma de una matriz unidimensional.
Los valores de código de entrada y pueden hacer referencia a este blog

#include<iostream>
#include<algorithm>
#include <vector>
#include<cstring> 
using namespace std;
const int maxn=105;
const int maxv=105;
const int maxt=15;
int N,V,T;
int v[maxn], w[maxn];
int dp[maxv]; //f存的是代价函数,因此以v为单位,f的意思是容量为c时该组取所需元素的最大值
int groupitem[maxt][maxn]; //a存放的是分组t里的物品编号

int main(){

    cin>>V>>N>>T;
   memset(&groupitem, 0, sizeof(groupitem)); //这一步似乎可有可无

    // 输入
    for(int i=1; i<=N; ++i){
        int p;
        cin>>w[i]>>v[i]>>p;
        groupitem[p][++groupitem[p][0]] = i;  //groupitem[p][0]来存放该组的数量
    }

    // 开始求解,分别是①对组;②对每组来说的容量;③对该组内的物品进行~
    for(int i=1; i<=T; ++i){
        for(int j=V; j>=0; --j)
            for(int k=1; k<=groupitem[i][0]; k++){
                int x = groupitem[i][k]; // 获取当前组的物品编号
                //记得if语句判断一下:
                if( j>=w[x] )
                    dp[j] = max(dp[j], v[x] + dp[j-w[x]]); //一维的写法,  关键是f[j-w[x]]去掉
            }
    }
    cout<<dp[V]<<endl; //从而输出:容量为j的时候

    return 0;

}


Publicado 63 artículos originales · elogios ganado 13 · Vistas a 40000 +

Supongo que te gusta

Origin blog.csdn.net/changreal/article/details/102582162
Recomendado
Clasificación