Share 0-1 knapsack problem c++

#0-1 Bài toán học
#C ++
#Knapsack vấn đề
#lập trình năng động
#algorithms

## Giới thiệu

Vấn đề 0-1 ba lô 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 đề ba lần là NP là NP, điều đó có nghĩa là không có thuật toán thời gian đa thức nào được biết đến để giải quyết nó.Tuy nhiên, có một số thuật toán xấp xỉ hiệu quả có thể được sử dụng để tìm một giải pháp tốt.

## Giải pháp lập trình động

Một trong những thuật toán hiệu quả nhất để giải quyết vấn đề ba lần 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 lập chỉ mục bởi khả năng của chiếc ba lô và số lượng vật phẩm đã được xem xét.

Để giải quyết vấn đề ba lô, chúng tôi bắt đầu bằng cách khởi tạo bảng thành tất cả các số không.Sau đó chúng tôi lặp lại các mặt hàng, một lần.Đối với mỗi mục, chúng tôi xem xét tất cả các cách có thể để thêm nó vào ba lô.Nếu mặt hàng phù hợp với ba lô, chúng tôi thêm giá trị của nó vào mục nhập bảng cho công suất hiện tại và số lượng vật phẩm đã được xem xét.

Khi chúng tôi đã lặp lại trên tất cả các mục, chúng tôi có thể tìm thấy giải pháp tối ưu bằng cách nhìn vào mục nhập bảng cho công suất tối đa và số lượng các mặt hàng.Mục nhập này sẽ chứa tổng giá trị tối đa có thể phù hợp với ba lô.

## Triển khai trong C ++

Sau đây là việc triển khai thuật toán lập trình động cho bài toán ba lần trong C ++:

`` `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 tổng giá trị tối đa có thể phù hợp với ba lô
// với một năng lực 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 (dung lượng + 1, vector <int> (items.size () + 1, 0));

// lặp lại các mục, một lần.
for (int i = 0; i <items.size (); i ++) {
// lặp lại các năng lực, từng lần một.
for (int j = 0; j <= công suất; j ++) {
// Nếu mặt hàng không phù hợp với ba lô, chúng ta có thể bỏ qua nó.
if (items . weight> j) {
Tiếp tục;
}

// Nếu không, chúng tôi xem xét tất cả các cách có thể để thêm mặt hàng vào ba lô.
// Nếu mặt hàng không được thêm vào ba lô, giải pháp giống như giải pháp
// đối với giải đấu con với khả năng của J và số lượng vật phẩm đã được
// được coi là trừ một.
int nottaken = bảng [j] [i - 1];

// Nếu mặt hàng được thêm vào ba lô, giải pháp là tối đa của giải pháp
// ĐỐI TƯỢNG ĐẾN NĂNG LỰC CỦA J - Mục .
// đã được coi là trừ một và giá trị của mặt hàng.
int TAKE = Bảng [J - Các mục .

// Giải pháp cho biểu tượng con với công suất của J và số lượng vật phẩm
// đã được xem xét là tối đa của các giải pháp với vật phẩm không được thực hiện
// và các mặt hàng được thực hiện.
Bảng [j] = max (nottaken, lấy);
}
}

// Tổng giá trị tối đa có thể phù hợp trong chiếc ba lô là giải pháp cho vấn đề phụ
=======================================
#0-1 Knapsack Problem
#C++
#Knapsack Problem
#Dynamic Programming
#algorithms

## Introduction

The 0-1 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 0-1 knapsack problem is NP-hard, which means that there is no known polynomial-time algorithm to solve it. However, there are a number of efficient approximation algorithms that can be used to find a good solution.

## The Dynamic Programming Solution

One of the most efficient algorithms for solving the 0-1 knapsack problem is the dynamic programming algorithm. This algorithm works by building up a table of solutions to subproblems of the knapsack problem. The table is indexed by the capacity of the knapsack and the number of items that have been considered.

To solve the knapsack problem, we start by initializing the table to all zeros. We then iterate over the items, one at a time. For each item, we consider all possible ways of adding it to the knapsack. If the item fits in the knapsack, we add its value to the table entry for the current capacity and the number of items that have been considered.

Once we have iterated over all of the items, we can find the optimal solution by looking at the table entry for the maximum capacity and the number of items. This entry will contain the maximum total value that can be fit in the knapsack.

## Implementation in C++

The following is an implementation of the dynamic programming algorithm for the 0-1 knapsack problem in C++:

```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 total 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(capacity + 1, vector<int>(items.size() + 1, 0));

// Iterate over the items, one at a time.
for (int i = 0; i < items.size(); i++) {
// Iterate over the capacities, one at a time.
for (int j = 0; j <= capacity; j++) {
// If the item does not fit in the knapsack, we can skip it.
if (items.weight > j) {
continue;
}

// Otherwise, we consider all possible ways of adding the item to the knapsack.
// If the item is not added to the knapsack, the solution is the same as the solution
// to the subproblem with a capacity of j and the number of items that have been
// considered minus one.
int notTaken = table[j][i - 1];

// If the item is added to the knapsack, the solution is the maximum of the solution
// to the subproblem with a capacity of j - items.weight and the number of items
// that have been considered minus one and the value of the item.
int taken = table[j - items.weight][i - 1] + items.value;

// The solution to the subproblem with a capacity of j and the number of items
// that have been considered is the maximum of the solutions with the item not taken
// and the item taken.
table[j] = max(notTaken, taken);
}
}

// The maximum total value that can be fit in the knapsack is the solution to the subproblem
 
Join Telegram ToolsKiemTrieuDoGroup
Back
Top