Share knapsack c++,

sontuyen59

New member
..

Vấn đề knapsack là một vấn đề kinh điển trong khoa học máy tính.Đó là một vấn đề tối ưu hóa trong đó bạn được cung cấp một tập hợp các mặt hàng, mỗi mặt hàng có trọng lượng và giá trị, và một chiếc ba lô với công suất tối đa.Mục tiêu là tìm tập hợp con của các mặt hàng có tổng giá trị cao nhất và phù hợp với ba lô.

Vấn đề knapsack là NP-hard, điều đó có nghĩa là không có thuật toán thời gian đa thức được biết đến để giải quyết nó.Tuy nhiên, có một số thuật toán gần đúng có thể được sử dụng để tìm một giải pháp tốt.

Một thuật toán như vậy là thuật toán lập trình động.Thuật toán này hoạt động bằng cách xây dựng một bảng các giải pháp cho các vấn đề phụ của vấn đề ba lô.Bảng sau đó được sử dụng để tìm giải pháp tối ưu cho vấn đề ba lô.

Thuật toán lập trình động cho vấn đề knapsack được thực hiện trong mã C ++ sau:

`` `C ++
#include <Istream>
#include <Vector>

sử dụng không gian tên STD;

// Một cấu trúc để đại diện cho một mục trong vấn đề ba lô.
Mục cấu trúc {
trọng lượng int;
giá trị int;
};

// một hàm để tính giá trị tối đa có thể phù hợp trong một chiếc ba lô với một công suất nhất định.
int knapsack (vector <items> items, int nave) {
// Tạo một bảng để lưu trữ các giải pháp cho các vấn đề phụ của vấn đề Knapsack.
vector <vector <int >> bảng (items.size () + 1, vector <int> (công suất + 1, 0));

// Xóa bảng bảng bằng cách giải quyết các vấn đề phụ của vấn đề knapsack.
for (int i = 0; i <= items.size (); i ++) {
for (int j = 0; j <= công suất; j ++) {
// Nếu chiếc ba lô trống, giá trị tối đa có thể phù hợp với nó là 0.
if (j == 0) {
Bảng [j] = 0;
} khác if (i == 0) {
// Nếu không có mặt hàng, giá trị tối đa có thể phù hợp với ba lô là 0.
Bảng [j] = 0;
} khác {
// Nếu trọng lượng của mặt hàng hiện tại nhỏ hơn hoặc bằng khả năng của ba lô,
// Sau đó, giá trị tối đa có thể phù hợp trong ba lô là tối đa của
// (1) Giá trị của mặt hàng hiện tại cộng với giá trị tối đa có thể phù hợp với ba lô
// với công suất giảm bởi trọng lượng của mặt hàng hiện tại và
// (2) Giá trị tối đa có thể phù hợp trong ba lô mà không cần mục hiện tại.
if (items [i - 1]. weight <= j) {
Bảng [j] = max (bảng [i - 1] [j], bảng [i - 1] [j - các mục [i - 1]. độ nặng] + các mục [i - 1] .value);
} khác {
// Nếu trọng lượng của mặt hàng hiện tại lớn hơn công suất của ba lô,
// Sau đó, giá trị tối đa có thể phù hợp trong chiếc ba lô là giá trị tối đa có thể phù hợp
// trong ba lô mà không có mục hiện tại.
Bảng [j] = bảng [i - 1] [j];
}
}
}
}

// Trả về giá trị tối đa có thể phù hợp trong ba lô.
Bảng trả về [items.size ()] [công suất];
}

int main () {
// Tạo một vectơ của các mặt hàng.
Vector <items> items = {
{10, 10},
{20, 20},
{30, 30}
};

// Tìm giá trị tối đa có thể phù hợp trong một chiếc ba lô với công suất 50.
int maxValue = knapsack (mục, 50);

// In giá trị tối đa.
=======================================
#Knapsack, #C++, #AlGorithM, #optimization, #datastructure ## Knapsack Problem in C++

The knapsack problem is a classic problem in computer science. It is an optimization problem where you are given a set of items, each with a weight and a value, and a knapsack with a maximum capacity. The goal is to find the subset of items that has the highest total value and that fits in the knapsack.

The knapsack problem is NP-hard, which means that there is no known polynomial-time algorithm to solve it. However, there are a number of approximation algorithms that can be used to find a good solution.

One such algorithm is the dynamic programming algorithm. This algorithm works by building up a table of solutions to subproblems of the knapsack problem. The table is then used to find the optimal solution to the knapsack problem.

The dynamic programming algorithm for the knapsack problem is implemented in the following C++ code:

```c++
#include <iostream>
#include <vector>

using namespace std;

// A struct to represent an item in the knapsack problem.
struct Item {
int weight;
int value;
};

// A function to calculate the maximum value that can be fit in a knapsack with a given capacity.
int knapsack(vector<Item> items, int capacity) {
// Create a table to store the solutions to subproblems of the knapsack problem.
vector<vector<int>> table(items.size() + 1, vector<int>(capacity + 1, 0));

// Populate the table by solving subproblems of the knapsack problem.
for (int i = 0; i <= items.size(); i++) {
for (int j = 0; j <= capacity; j++) {
// If the knapsack is empty, the maximum value that can be fit in it is 0.
if (j == 0) {
table[j] = 0;
} else if (i == 0) {
// If there are no items, the maximum value that can be fit in the knapsack is 0.
table[j] = 0;
} else {
// If the weight of the current item is less than or equal to the capacity of the knapsack,
// then the maximum value that can be fit in the knapsack is the maximum of
// (1) the value of the current item plus the maximum value that can be fit in the knapsack
// with the capacity decreased by the weight of the current item, and
// (2) the maximum value that can be fit in the knapsack without the current item.
if (items[i - 1].weight <= j) {
table[j] = max(table[i - 1][j], table[i - 1][j - items[i - 1].weight] + items[i - 1].value);
} else {
// If the weight of the current item is greater than the capacity of the knapsack,
// then the maximum value that can be fit in the knapsack is the maximum value that can be fit
// in the knapsack without the current item.
table[j] = table[i - 1][j];
}
}
}
}

// Return the maximum value that can be fit in the knapsack.
return table[items.size()][capacity];
}

int main() {
// Create a vector of items.
vector<Item> items = {
{10, 10},
{20, 20},
{30, 30}
};

// Find the maximum value that can be fit in a knapsack with a capacity of 50.
int maxValue = knapsack(items, 50);

// Print the maximum value.
 
Join Telegram ToolsKiemTrieuDoGroup
Back
Top