0/1 Problema de mochila para imprimir todas las soluciones posibles

Dados los pesos y ganancias de N artículos, coloque estos artículos en una mochila de capacidad W. La tarea es imprimir todas las soluciones posibles al problema de tal manera que no queden artículos cuyo peso sea menor que la capacidad restante de la mochila. Además, calcule la ganancia máxima.
Ejemplos: 
 

Entrada: Beneficios[] = {60, 100, 120, 50} 
Pesos[] = {10, 20, 30, 40}, W = 40 
Salida: 
10: 60, 20: 100, 
10: 60, 30: 120, 
Beneficio máximo = 180 
Explicación: 
El beneficio máximo de todas las soluciones posibles es 180
Entrada: Beneficios[] = {60, 100, 120, 50} 
Pesos[] = {10, 20, 30, 40}, W = 50 
Salida: 
10 : 60, 20: 100, 
10: 60, 30: 120, 
20: 100, 30: 120, 
Beneficio máximo = 220 
Explicación: 
El beneficio máximo de todas las soluciones posibles es 220 
 

Enfoque: La idea es hacer pares para el peso y los beneficios de los artículos y luego probar todas las permutaciones de la array e incluir los pesos hasta que no haya ningún artículo cuyo peso sea menor que la capacidad restante de la mochila. Mientras tanto, después de incluir un artículo, incremente la ganancia de esa solución por la ganancia de ese artículo. 
A continuación se muestra la implementación del enfoque anterior:
 

C++

// C++ implementation to print all
// the possible solutions of the
// 0/1 Knapsack problem
 
#include <bits/stdc++.h>
 
using namespace std;
 
// Utility function to find the
// maximum of the two elements
int max(int a, int b) {
    return (a > b) ? a : b;
}
 
// Function to find the all the
// possible solutions of the
// 0/1 knapSack problem
int knapSack(int W, vector<int> wt,
            vector<int> val, int n)
{
    // Mapping weights with Profits
    map<int, int> umap;
     
    set<vector<pair<int, int>>> set_sol;
    // Making Pairs and inserting
    // into the map
    for (int i = 0; i < n; i++) {
        umap.insert({ wt[i], val[i] });
    }
 
    int result = INT_MIN;
    int remaining_weight;
    int sum = 0;
     
    // Loop to iterate over all the
    // possible permutations of array
    do {
        sum = 0;
         
        // Initially bag will be empty
        remaining_weight = W;
        vector<pair<int, int>> possible;
         
        // Loop to fill up the bag
        // until there is no weight
        // such which is less than
        // remaining weight of the
        // 0-1 knapSack
        for (int i = 0; i < n; i++) {
            if (wt[i] <= remaining_weight) {
 
                remaining_weight -= wt[i];
                auto itr = umap.find(wt[i]);
                sum += (itr->second);
                possible.push_back({itr->first,
                     itr->second
                });
            }
        }
        sort(possible.begin(), possible.end());
        if (sum > result) {
            result = sum;
        }
        if (set_sol.find(possible) ==
                        set_sol.end()){
            for (auto sol: possible){
                cout << sol.first << ": "
                     << sol.second << ", ";
            }
            cout << endl;
            set_sol.insert(possible);
        }
         
    } while (
        next_permutation(wt.begin(),
                           wt.end()));
    return result;
}
 
// Driver Code
int main()
{
    vector<int> val{ 60, 100, 120 };
    vector<int> wt{ 10, 20, 30 };
    int W = 50;
    int n = val.size();
    int maximum = knapSack(W, wt, val, n);
    cout << "Maximum Profit = ";
    cout << maximum;
    return 0;
}

Python3

# Python3 implementation to print all
# the possible solutions of the
# 0/1 Knapsack problem
 
 
INT_MIN=-2147483648
def nextPermutation(nums: list) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        if sorted(nums,reverse=True)==nums:
            return None
        n=len(nums)
        brk_point=-1
        for pos in range(n-1,0,-1):
            if nums[pos]>nums[pos-1]:
                brk_point=pos
                break
        else:
            nums.sort()
            return
        replace_with=-1
        for j in range(brk_point,n):
            if nums[j]>nums[brk_point-1]:
                replace_with=j
            else:
                break
        nums[replace_with],nums[brk_point-1]=nums[brk_point-1],nums[replace_with]
        nums[brk_point:]=sorted(nums[brk_point:])
        return nums
 
# Function to find the all the
# possible solutions of the
# 0/1 knapSack problem
def knapSack(W, wt, val, n):
    # Mapping weights with Profits
    umap=dict()
     
    set_sol=set()
    # Making Pairs and inserting
    # o the map
    for i in range(n) :
        umap[wt[i]]=val[i]
     
 
    result = INT_MIN
    remaining_weight=0
    sum = 0
     
    # Loop to iterate over all the
    # possible permutations of array
    while True:
        sum = 0
         
        # Initially bag will be empty
        remaining_weight = W
        possible=[]
         
        # Loop to fill up the bag
        # until there is no weight
        # such which is less than
        # remaining weight of the
        # 0-1 knapSack
        for i in range(n) :
            if (wt[i] <= remaining_weight) :
 
                remaining_weight -= wt[i]
                sum += (umap[wt[i]])
                possible.append((wt[i],
                     umap[wt[i]])
                )
             
         
        possible.sort()
        if (sum > result) :
            result = sum
         
        if (tuple(possible) not in set_sol):
            for sol in possible:
                print(sol[0], ": ", sol[1], ", ",end='')
             
            print()
            set_sol.add(tuple(possible))
         
         
        if not nextPermutation(wt):
            break
    return result
 
 
# Driver Code
if __name__ == '__main__':
    val=[60, 100, 120]
    wt=[10, 20, 30]
    W = 50
    n = len(val)
    maximum = knapSack(W, wt, val, n)
    print("Maximum Profit =",maximum)
 
#This code was contributed by Amartya Ghosh
Producción: 

10: 60, 20: 100, 
10: 60, 30: 120, 
20: 100, 30: 120, 
Maximum Profit = 220

 

Publicación traducida automáticamente

Artículo escrito por akshitsaxenaa09 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *