Share knapsack c++ source code

vietchinh862

New member
## Vấn đề knapsack

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ô.Khi bảng được xây dựng, nó có thể được sử dụng để tìm giải pháp tối ưu cho vấn đề ba lô.

Sau đây là mã nguồn C ++ cho 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, 0));

// Xóa bảng bảng bằng cách giải các bài toán con.
for (int i = 0; i <= trọng lượng.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ể được đóng gói là 0.
if (j == 0) {
Bảng [j] = 0;
} khác if (i == 0) {
// Nếu không có mục, giá trị tối đa có thể được đóng gói 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
// Năng lực của chiếc ba lô, sau đó chúng ta có thể đóng gói mặt hàng hay không.
// Nếu chúng tôi đóng gói mặt hàng, giá trị tối đa có thể được đóng gói là
// Giá trị của mặt hàng cộng với giá trị tối đa có thể được đóng gói trong một
// Knapsack với công suất bằng khả năng của chiếc ba lô trừ đi
// trọng lượng của mặt hàng.Nếu chúng ta không đóng gói mặt hàng, giá trị tối đa
// có thể đóng gói là giá trị tối đa có thể được đóng gói trong
// ba lô với công suất bằng công suất của ba lô.
if (trọng số [i - 1] <= j) {
Bảng [j] = max (giá trị [i - 1] + bảng [i - 1] [j - trọng số [i - 1]],
Bảng [i - 1] [j]);
} khác {
Bảng [j] = bảng [i - 1] [j];
}
}
}
}

// Trả về giá trị tối đa có thể được đóng gói trong ba lô.
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ô.
công suất int = 10;

// Tìm giá trị tối đa có thể được đóng gói trong ba lô.
int maxValue = knapsack (trọng số, giá trị, công suất);

// In giá trị tối đa.
cout << "Giá trị tối đa có thể được đóng gói trong ba lô là" << MaxValue << endl;

trả lại 0;
}
`` `

## hashtags

* #Knapsack
* #lập trình năng động
=======================================
## 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. Once the table is built, it can be used to find the optimal solution to the knapsack problem.

The following is the C++ source code for 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, 0));

// Populate the table by solving subproblems.
for (int i = 0; i <= weights.size(); i++) {
for (int j = 0; j <= capacity; j++) {
// If the knapsack is empty, the maximum value that can be packed is 0.
if (j == 0) {
table[j] = 0;
} else if (i == 0) {
// If there are no items, the maximum value that can be packed 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 we can either pack the item or not.
// If we pack the item, the maximum value that can be packed is the
// value of the item plus the maximum value that can be packed in a
// knapsack with a capacity equal to the capacity of the knapsack minus
// the weight of the item. If we don't pack the item, the maximum value
// that can be packed is the maximum value that can be packed in a
// knapsack with a capacity equal to the capacity of the knapsack.
if (weights[i - 1] <= j) {
table[j] = max(values[i - 1] + table[i - 1][j - weights[i - 1]],
table[i - 1][j]);
} else {
table[j] = table[i - 1][j];
}
}
}
}

// Return the maximum value that can be packed in the knapsack.
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.
int capacity = 10;

// Find the maximum value that can be packed in the knapsack.
int maxValue = knapsack(weights, values, capacity);

// Print the maximum value.
cout << "The maximum value that can be packed in the knapsack is " << maxValue << endl;

return 0;
}
```

## Hashtags

* #Knapsack
* #Dynamic programming
 
Join Telegram ToolsKiemTrieuDoGroup
Back
Top