Share knapsack problem c++

smallmeercat703

New member
#Knapsack vấn đề #C ++

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 được điền vào từ dưới lên, bắt đầu với các tiểu cầu nơi chiếc ba lô trống rỗng.

Để điền vào một ô trong bảng, chúng tôi xem xét tất cả các mục có thể được bao gồm trong ba lô.Đối với mỗi mặt hàng, chúng tôi thêm mục vào ba lô và xem liệu tổng trọng lượng có còn nhỏ hơn công suất không.Nếu có, chúng tôi cập nhật giá trị của ô là tối đa của giá trị của ô trước khi mặt hàng được thêm vào và giá trị của mặt hàng.

Khi bảng được điền vào, chúng ta có thể tìm thấy giải pháp cho vấn đề ba lô bằng cách tìm ô trong bảng có giá trị cao nhất.Các mục tương ứng với các mục trong ô này là các mục nên được bao gồm trong ba lô.

Thuật toán lập trình động cho vấn đề knapsack có độ phức tạp về thời gian của O (NW), trong đó n là số lượng vật phẩm và W là khả năng của ba lô.Đây là một thuật toán thời gian đa thức, vì vậy nó có thể được sử dụng để tìm giải pháp cho vấn đề ba lô trong một khoảng thời gian hợp lý.

Một thuật toán khác có thể được sử dụng để giải quyết vấn đề ba lô là thuật toán tham lam.Thuật toán này hoạt động bằng cách lặp lại thêm mục có tỷ lệ giá trị trên trọng lượng cao nhất vào ba lô cho đến khi đạt được công suất.

Thuật toán tham lam không phải lúc nào cũng tìm thấy một giải pháp tối ưu cho vấn đề ba lô, nhưng nó thường tìm thấy một giải pháp gần với tối ưu.Thuật toán tham lam có độ phức tạp về thời gian của O (N), nhanh hơn nhiều so với thuật toán lập trình động.

### C ++ triển khai

Sau đây là việc triển khai C ++ của thuật toán lập trình động cho vấn đề knapsack:

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

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

// Hàm này trả về giá trị tối đa có thể
// Đóng gói trong một chiếc ba lô với một công suất nhất định.
int knapsack (vector <tint> trọng số, vector <tint> giá trị, công suất int) {
// Tạo một bảng để lưu trữ các giải pháp cho các vấn đề phụ.
vector <vector <int >> bảng (trọng lượng.size () + 1, vector <int> (công suất + 1));

// Khởi tạo bảng.
for (int i = 0; i <= trọng lượng.size (); i ++) {
for (int j = 0; j <= công suất; j ++) {
if (i == 0 || j == 0) {
Bảng [j] = 0;
} khác {
Bảng [j] = bảng [i - 1] [j];
if (trọng số [i - 1] <= j) {
Bảng [j] = max (bảng [j], giá trị [i - 1] + bảng [i - 1] [j - trọng số [i - 1]]);
}
}
}
}

// Trả về giá trị tối đa trong bảng.
bảng trả lại [trọng lượng.size ()] [công suất];
}

int main () {
// Xác định các trọng số và giá trị của các mục.
Vector <Int> trọng số = {1, 2, 3, 4, 5};
Vector <Int> value = {10, 20, 30, 40, 50};

// Xác định công suất của ba lô.
=======================================
#Knapsack Problem #C++ #Dynamic Programming #Greedy Algorithm #optimization ### The Knapsack Problem

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 filled in from the bottom up, starting with the subproblems where the knapsack is empty.

To fill in a cell in the table, we consider all of the items that could be included in the knapsack. For each item, we add the item to the knapsack and see if the total weight is still less than the capacity. If it is, we update the value of the cell to be the maximum of the value of the cell before the item was added and the value of the item.

Once the table is filled in, we can find the solution to the knapsack problem by finding the cell in the table that has the highest value. The items that correspond to the items in this cell are the items that should be included in the knapsack.

The dynamic programming algorithm for the knapsack problem has a time complexity of O(nW), where n is the number of items and W is the capacity of the knapsack. This is a polynomial-time algorithm, so it can be used to find a solution to the knapsack problem in a reasonable amount of time.

Another algorithm that can be used to solve the knapsack problem is the greedy algorithm. This algorithm works by iteratively adding the item with the highest value-to-weight ratio to the knapsack until the capacity is reached.

The greedy algorithm does not always find an optimal solution to the knapsack problem, but it often finds a solution that is close to optimal. The greedy algorithm has a time complexity of O(n), which is much faster than the dynamic programming algorithm.

### C++ Implementation

The following is a C++ implementation of the dynamic programming algorithm for the knapsack problem:

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

using namespace std;

// This function returns the maximum value that can be
// packed in a knapsack with a given capacity.
int knapsack(vector<int> weights, vector<int> values, int capacity) {
// Create a table to store the solutions to subproblems.
vector<vector<int>> table(weights.size() + 1, vector<int>(capacity + 1));

// Initialize the table.
for (int i = 0; i <= weights.size(); i++) {
for (int j = 0; j <= capacity; j++) {
if (i == 0 || j == 0) {
table[j] = 0;
} else {
table[j] = table[i - 1][j];
if (weights[i - 1] <= j) {
table[j] = max(table[j], values[i - 1] + table[i - 1][j - weights[i - 1]]);
}
}
}
}

// Return the maximum value in the table.
return table[weights.size()][capacity];
}

int main() {
// Define the weights and values of the items.
vector<int> weights = {1, 2, 3, 4, 5};
vector<int> values = {10, 20, 30, 40, 50};

// Define the capacity of the knapsack.
 
Join Telegram ToolsKiemTrieuDoGroup
Back
Top