Tải bản đầy đủ (.pdf) (42 trang)

đồ án cuối kì môn phân tích thiết kế và giải thuật knapsack problem

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.34 MB, 42 trang )

<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">

<b>THÀNH PHỐ HỒ CHÍ MINH, NĂM 2023</b>

</div><span class="text_page_counter">Trang 2</span><div class="page_container" data-page="2">

<b>THÀNH PHỐ HỒ CHÍ MINH, NĂM 2023</b>

</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">

<b>LỜI CẢM ƠN</b>

Lời đầu tiên, em xin trân trọng cảm ơn giảng viên người đã trực tiếp chỉ bảo, và truyền đạt kiến thức để hoàn thành bài báo cáo này.

</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">

<b>ĐỒ ÁN ĐƯỢC HỒN THÀNHTẠI TRƯỜNG ĐẠI HỌC TƠN ĐỨC THẮNG</b>

Tơi xin cam đoan đây là sản phẩm đồ án của riêng tôi. Các nội dung nghiên cứu,kết quả trong đề tài này là trung thực và chưa công bố dưới bất kỳ hình thức nào trướcđây. Những số liệu trong các bảng biểu phục vụ cho việc phân tích, nhận xét, đánh giáđược chính tác giả thu thập từ các nguồn khác nhau có ghi rõ trong phần tài liệu thamkhảo.

Ngồi ra, trong đồ án còn sử dụng một số nhận xét, đánh giá cũng như số liệucủa các tác giả khác, cơ quan tổ chức khác đều có trích dẫn và chú thích nguồn gốc.

<b>Nếu phát hiện có bất kỳ sự gian lận nào tơi xin hồn tồn chịu trách nhiệmvề nội dung đồ án của mình. Trường đại học Tôn Đức Thắng không liên quan đến</b>

những vi phạm tác quyền, bản quyền do tơi gây ra trong q trình thực hiện (nếu có).

<i>TP. Hồ Chí Minh, ngày 05 tháng 12 năm 2023 Tác giả</i>

<i>(ký tên và ghi rõ họ tên)ThànhNguyễn Tấn Thành</i>

</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">

<b>PHẦN XÁC NHẬN VÀ ĐÁNH GIÁ CỦA GIẢNG VIÊN</b>

<b>Phần xác nhận của GV hướng dẫn</b>

<small>Tp. Hồ Chí Minh, ngày tháng năm (kí và ghi họ tên)</small>

<b>Phần đánh giá của GV chấm bài</b>

<small>Tp. Hồ Chí Minh, ngày tháng năm (kí và ghi họ tên)</small>

</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">

<b>TĨM TẮT</b>

Bài tốn Knapsack (hay cịn gọi là bài tốn cái ba lơ) là một bài tốn tối ưu hóa trong lĩnh vực quy hoạch động và tối ưu hóa kết hợp. Bài tốn này có nhiều biến thể, nhưng cơ bản, nó đặt ra một vấn đề quyết định

mục tiêu chính của giải quyết Knapsack Problem là tìm ra tập hợp tối ưu những đối tượng để đặt vào cặp xách sao cho giá trị của chúng là lớn nhất mà không vượt quá trọng lượng tối đa cho phép. Việc này có ý nghĩa lớn trong quyết định tối ưu về tài nguyên, ví dụ như quản lý dự án, lập kế hoạch sản xuất, hoặc quản lý tài sản.Sau đây chúng ta sẽ giải quyết bài toán này.

</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">

CHƯƠNG 2 – CÁC LOẠI BÀI TOÁN TRONG KNAPSACK...5

2.1 0/1 Knapsack Problem:...5

2.2 Fractional Knapsack Problem:...6

2.3 Multiple Knapsack...7

CHƯƠNG 3 – CÁC PHƯƠNG PHÁP GIẢI BÀI TỐN KNAPSACK PROBLEM....8

3.1 Giải quyết bài tốn cái túi bằng thuật toán trực tiếp với KapSack 0/1 force)...10

(Brute-3.2 Giải quyết bài toán cái túi bằng thuật toán tham lam cho bài toán Fractional Knapsack Problem (Greedy)...16

3.3 Giải quyết bài toán cái túi bằng thuật toán quy hoạch động...22

Knapsack Problem 0/1 (Dynamic Programming)...22

CHƯƠNG 4 – Xây Dựng data và hiện thực thuật toán...28

CHƯƠNG 5 – Kết Luận Với Các Thuật Toán Trên...36

</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">

<b>CHƯƠNG 1 – MỞ ĐẦU</b>

<b>Cụ thể, bài tốn có thể được mơ tả như sau:</b>

Cho một danh sách các mục, mỗi mục có một giá trị (lợi nhuận) và một trọng lượng.

Cho trước một giới hạn về trọng lượng mà một cái ba lơ (hoặc một khơng gian) có thể chứa.

Mục tiêu là chọn một tập hợp các mục sao cho tổng giá trị là lớn nhất, nhưng tổng trọng lượng không vượt q giới hạn đã cho.

<b>Ví dụ thực tế:</b>

Bài tốn :

Mô tả: Người du lịch muốn chuẩn bị một ba lô để một chuyến du lịch ngắn hạn. Ba lô của anh ta có giới hạn trọng lượng và anh ta muốn đảm bảo rằng anh ta mang theo những vật dụng quan trọng nhất mà không vượt quá trọng lượng tối đa của ba lô.Dữ liệu vào:

</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">

Danh sách các mục mà anh ta có thể mang theo (quần áo, máy ảnh, sổ tay, sách, điện thoại, sạc, ...)

Mỗi mục có một trọng lượng và giá trị tương ứng (có thể là tiện ích hoặc giá trị cá nhân).

</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">

n số đồ vật, và biểu diễn quyết định của bài toán <small>x1</small>, <small>x2</small>, …, <small>xn</small> trong đó

<small>xi≥ 0 , i=1 ,n</small>

<small>valueigiá trị củavậtthứ ixi</small>

<small>weig hti</small> là trọng lượng <small>của vậtthứ ixi</small>Hàm mục tiêu :

Hàm ràng buộc :

<small>x</small><sub>i</sub><small>.weight</small><sub>i</sub><small>≤Capacityxi≥0 và số nguyên,i=1,…,n</small>

<b>CHƯƠNG 2 – CÁC LOẠI BÀI TOÁN TRONG KNAPSACK</b>

<b>2.1 0/1 Knapsack Problem:</b>

Trong vấn đề này, mỗi đối tượng có hai lựa chọn: chọn hoặc khơng chọn.

Điều này có nghĩa là bạn khơng thể chia nhỏ một đối tượng và đặt mộtphần nó vào túi, mà bạn phải quyết định chọn hoặc không chọn nó ngun vẹn.

Ví dụ: Nếu bạn có một chiếc ba có khả năng chịu tải 10kg và ba đối tượng với trọng lượng lần lượt là 5kg, 3kg, và 8kg, bạn phải quyết định chọn đối tượng nào và không thể chia nhỏ chúng.

- Hạn chế mỗi đồ vật thuộc loại 0 và 1 (không chọn, hoặc chọn)

</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">

Được phát biểu như sau:

<small>x</small><sub>i</sub><small>.value</small><sub>i</sub><small>→max</small>Sao cho:

<small>xi.weighti≤Capacityxi=0hoặc1 và số nguyên,i=1 ,…,n</small>

<b>2.2 Fractional Knapsack Problem:</b>

Trái ngược với 0/1 Knapsack, trong vấn đề này, bạn có thể chia nhỏ đối tượng để đặt một phần của nó vào túi.

Điều này tạo ra một mức linh hoạt lớn hơn trong việc chọn lựa, vì bạn có thể chọn một phần của đối tượng để tối ưu hóa giá trị tổng cộng.

Ví dụ: Nếu bạn có một túi chịu tải 10kg và một đối tượng có trọng lượng 5kg, bạn có thể đặt nửa đối tượng vào túi để tối ưu hóa giá trị nếu giá trị của đối tượng phụ thuộc vào trọng lượng.

<small>x</small><sub>i</sub><small>.value</small><sub>i</sub><small>→max</small>Sao cho:

<small>xi.weighti≤Capacity0 ≤ x≤ 1 vàsố nguyên,i=1 ,…</small>

</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">

<b>2.3 Multiple Knapsack</b>

Bài toán Multiple Knapsack (MKP) là một phần mở rộng của Bài toán ba lơ cổ điển (KP), trong đó có nhiều chiếc ba lơ, mỗi chiếc có hạn chế về dung lượng riêng. Trong vấn đề tối ưu hóa này, một tập hợp các vật phẩm cần được phân bổ cho các ba lô khác nhau sao cho tổng giá trị được tối đa hóa trong khi vẫn tơn trọng giới hạn dung lượng riêng của từng ba lô.

Mô tả chi tiết như sau:

Nhiều Túi: Có nhiều túi, mỗi túi có một giới hạn trọng lượng cụ thể.Nhiều Đối Tượng: Có một danh sách các đối tượng, mỗi đối tượng có trọng lượng và giá trị riêng.

Mục Tiêu: Mục tiêu vẫn là tối ưu hóa tổng giá trị của các đối tượng được đặt vào túi, nhưng với ràng buộc là không vượt quá trọng lượng cho mỗi túi.

Thuật toán cho Multiple Knapsack Problem thường kế thừa ý tưởng từ thuật toán cho 0/1 Knapsack, nhưng mở rộng để xử lý nhiều túi. Các phương pháp giải quyết thường sử dụng các kỹ thuật như quy hoạch động hoặc các phương pháp tìm kiếm và tối ưu hóa.

Ví dụ, nếu bạn có nhiều túi với khả năng chịu tải là 10kg, 15kg và 20kg, và một danh sách các đối tượng với trọng lượng và giá trị tương ứng, thuậttoán sẽ cố gắng phân phối các đối tượng vào các túi để tối ưu hóa tổng giá trị và đồng thời khơng vượt q trọng lượng cho mỗi túi.

Bài tốn đi tìm lời giải cho

<sup>n</sup> <small>xij.valuej→max</small>

</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14">

Sao cho

{ ∑

<small>xij.weightij≤Capacityi,Vớii ϵ[1,m]x</small><sub>ij</sub><small>ϵ</small>{<small>0,1</small>}<small>,where jϵ</small>[<small>1,n</small>]<small>,iϵ[1 ,m]</small>

Chú thích:

n là số lượng đồ vật m là số lượng balo<small>value</small><sub>j</sub> là giá trị vật phẩm thứ j

<small>weight</small><sub>ij</sub>là trọng lượng của vật phẩm j trong balo I<small>Capacityi</small> là sức chứa của ba lô i

<small>x</small><sub>ij</sub> là biến nhị phân cho biết vật thứ j có được chọn để đặt vào balo thứ hay không

<b>CHƯƠNG 3 – CÁC PHƯƠNG PHÁP GIẢI BÀI TOÁN KNAPSACK PROBLEM</b>

<b>Dữ liệu đầu vào và đầu ra của các thuật toán</b>

Input :

- Các thuật toán sẽ nhận vào một danh các giá trị của đồ vật (values[]) và danh sách trọng lượng của đồ vật (weights[]) vào cùngmột mảng

- Nhận vào Trọng tải của balo (Capacity)

</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15">

- Số chỉ mục của 2 mảng weights[], values[] tương ứng với thứ tự đồ vật. Ví dụ: trên hình index 0 tương ứng với vật đầu tiên với: trọng lượng 70 và giá trị 135

</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16">

Thử tất cả các <small>2n</small> khả năng chọn lựa để tìm ra tập con đối tượng sao cho tổng trọng lượng không vượt quá trọng lượng tối đa cho túi và tổng giá trị là lớn nhất.

Phương pháp Brute-Force là một cách tiếp cận đơn giản nhưng khơng hiệu quả với bài tốn Knapsack và Fractional Knapsack do nó thử tất cả các khả năng có thể của việc chọn hoặc khơng chọn mỗi mục, sau đó kiểm tra xem liệu nó có đáp ứng các ràng buộc haykhơng. Dưới đây là cách giải bài tốn Fractional Knapsack bằng phương pháp Brute-Force:

o Tạo tất cả các tổ hợp có thể của việc chọn hoặc khơng chọn mỗi đối tượng.

Mỗi đối tượng có hai lựa chọn: chọn hoặc khơng chọn. Do đó, số lượng tổ hợp sẽ là<small>2n</small>, nơi n là số lượng đối tượng.

o Trả về giải pháp tối ưu

Mặc dù phương pháp Brute-Force có thể đảm bảo tìm ra giải pháp tối ưu, nhưng độ phức tạp thời gian của nó là O(<small>2n¿</small>,nơi n là số lượng đối tượng.

</div><span class="text_page_counter">Trang 17</span><div class="page_container" data-page="17">

Đối với các bài tốn có số lượng đối tượng lớn, phương pháp này trở nên khơng hiệu quả về mặt thời gian.

Ví dụ Bài toán KnapSack 0/1 Problem với giải thuật brute-force:

<b>Tổ hợp đồ vật</b>

</div><span class="text_page_counter">Trang 18</span><div class="page_container" data-page="18">

o Trọng số mảng chứa trọng số của tất cả các mụco Giá trị mảng chứa giá trị của tất cả các mục

o Mảng A được khởi tạo bằng 0 được sử dụng để tạo chuỗi bit• Đầu ra trả về mảng với:

o 2 phần tử cuối của mảng lần lượt là giá trị tốt nhất và trọng lượng của nó

o Các giá trị trước đó là danh sách các đồ vật được chọn

</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19">

- Tiếp theo sử dụng vòng for lồng nhau với vòng for đầu tiên duyệt qua <small>2n</small> tổ hợp để lọc chọn tổ hợp xét giá trị

</div><span class="text_page_counter">Trang 20</span><div class="page_container" data-page="20">

- Vòng while bên trong sẽ chịu trách nhiệm tạo ra tổ hợp

- Vòng for tiếp theo tính tốn giá trị của tổ hợp và chọn giá trị tốt nhất

- Cuối cùng trả về kết quả

</div><span class="text_page_counter">Trang 21</span><div class="page_container" data-page="21">

Độ phức tạp cho đoạn code:

- Time Complexity Analysis

<small>j =n1</small>

<small>¿¿¿¿(2 n).</small>[<small>1+…+1</small>]<small>¿</small>

<small>¿O</small>(<small>2 n∗2n</small>)<small>¿O</small>(<small>n∗2n</small>)

- Time Complexity Analysis

Thuật toán sử dụng mảng để lưu trữ quyết định tốt nhất, quyết định tạm thời và kết quả.

Độ phức tạp không gian của các mảng là O(n), trong đó n là số lượng mục.

Vì độ phức tạp của thuật tốn này tăng theo cấp số nhân nên nó chỉ có thể được sử dụng cho các trường hợp nhỏ của Sự cố KnapSack. Mặt khác, nó khơng địi hỏi nhiều nỗ lực lập trình để triển khai. Ngồi bộ nhớ được sử dụng để lưu trữ giá trị và trọng lượng của tất cả các mục, thuật toán này yêu cầu mảng hai chiều (A[] và bestChoice[]).

</div><span class="text_page_counter">Trang 22</span><div class="page_container" data-page="22">

<b>3.2 Giải quyết bài toán cái túi bằng thuật toán tham lam cho bài toán Fractional Knapsack Problem (Greedy)</b>

<b>Cách tiếp cận bài toán:</b>

1. Chọn mục có giá trị lớn nhất trong số các mục còn lại; điều này làm tăng giá trị của chiếc ba lô càng nhanh càng tốt.

2. Chọn vật dụng nhẹ nhất trong số những vật dụng còn lại để sử dụng hết dung lượng càng chậm càng tốt để có thể nhét nhiều vật dụng hơn vào ba lơ.3. Chọn những mặt hàng có giá trị trên mỗi trọng lượng càng cao càng tốt

- Đây là lời giải thích tại sao chiến lược thứ ba, chọn các mặt hàng có tỷ lệ giá trịtrên trọng lượng càng cao càng tốt, thường mang lại kết quả tốt:

Tối đa hóa giá trị một cách nhanh chóng:

Chiến lược này ưu tiên các mặt hàng có tỷ lệ giá trị trên trọng lượngcao. Bằng cách chọn những món đồ mang lại giá trị cao nhất cho

trọng lượng của chúng, bạn sẽ nhanh chóng tăng giá trị tổng thể của chiếc ba lơ.

Sử dụng hiệu quả năng lực:

Việc lựa chọn những món đồ có tỷ lệ giá trị trên trọng lượng cao cho phép sử dụng hiệu quả sức chứa của ba lô. Bạn đang bao gồm các mục đóng góp đáng kể vào tổng giá trị trong khichiếm ít khơng gian hơn.

Tránh quá chú trọng vào cân nặng:

Việc ưu tiên tỷ lệ giá trị trên trọng lượng cao giúp tránh các tình huống trong đó một mặt hàng có thể có giá trị rất cao nhưng cũng

</div><span class="text_page_counter">Trang 23</span><div class="page_container" data-page="23">

có trọng lượng rất cao. Trong những trường hợp như vậy, việc chọn vật phẩm nhẹ nhất có thể khơng nhất thiết phải tối đa hóa giá trị tổng thể.

<b>Cách giải bài toán: </b>

Sắp xếp các đồ vật theo thứ tự không tăng của giá trị với trọng lượng <sup>vi</sup><small>wi</small> Nếu trọng lượng của đối tượng nhỏ hơn hoặc bằng trọng lượng cịnlại của túi, chọn đối tượng này hồn tồn.

Nếu khơng, chọn một phần của đối tượng để điền vào túi sao cho túi đầ

</div><span class="text_page_counter">Trang 24</span><div class="page_container" data-page="24">

Step 2 Arrange all the items in descending order based on P<small>i</small>/W<small>i</small>

<b>Đầu vào </b>

• GreedyAlgorithm (Weights [1 … N], Values [1 … N])

</div><span class="text_page_counter">Trang 25</span><div class="page_container" data-page="25">

• Input:

• Trọng số mảng chứa trọng số của tất cả các mục• Giá trị mảng chứa giá trị của tất cả các mục

• Output: Giải pháp lựa chọn của phần tử của danh sách sản phẩm trong mảng.

for all items do

if the current item on the list fits into the knapsack then• place it in the knapsack

</div><span class="text_page_counter">Trang 26</span><div class="page_container" data-page="26">

- Tiến hành lặp qua tất cả các phẩn từ đã sắp xếp vào đưa nó mảng selectedQuantities và tính bestvalue

</div><span class="text_page_counter">Trang 27</span><div class="page_container" data-page="27">

- Cuối kết quả được trả về trong một đối tượng Tuple bao gồm mảng chứa lượng của từng mục được chọn và tổng giá trị tối đa có thể đạtđược.

<b>Độ phức tạp:</b>

- Time Complexity Analysis

Sắp xếp theo bất kỳ thuật toán nâng cao nào là O(NlogN)

<small>1=</small>[<small>1+…+1</small>]<small>N(¿)=O(N )</small>

Từ 2 ý trên, độ phức tạp của thuật toán tham lam là O(NlogN) + O(N) = O(NlogN). Về mặt bộ nhớ, thuật toán này chỉ yêu cầu mảng một chiều để ghi lại chuỗi nghiệm.

- Space Complexity Analysis

mergeSort: thuật toán sắp xếp merge khôngyêu cầu không gian bổ sung để tạo ra mảng tạm. Độ phức tạp không gian của merge sort là O(n)

Giải thuật sử dụng mảng để lưu trữ chỉ số, giá trị, trọng lượng, và lượng được chọn. Độ phức tạp không gian cho những mảng này là O(n), trong đó n là số lượng mục.

Fractional Knapsack với greedy có độ phức tạp thời gian là O(nlogn) do merge sort. Độ phức tạp không gian là O(n) chủ

</div><span class="text_page_counter">Trang 28</span><div class="page_container" data-page="28">

yếu do yêu cầu không gian bổ sung từ merge sort và các mảng sửdụng để lưu thơng tin.

<b>3.3 Giải quyết bài tốn cái túi bằng thuật toán quy hoạch động Knapsack Problem 0/1 (Dynamic Programming)</b>

<b>Dữ liệu:</b>

n là số đồ vật

Capacity là khả năng chịu tải của cái túi

- Mô tả: với mỗi đồ vật từ 1 <small>≤</small> i <small>≤</small>n và khả năng chịu tải 0 <small>≤</small> w <small>≤</small> Capacity. tính value[i,w] là tổng giá trị lớn nhất của đồ vật được chọn trong số i đồ vật đầu tiên có tổng trọng số khơng vượt q w.

- Có tất cả n(Capacity) bài tốn.

- Giá trị tối ưu cần tìm là value[n, Capacity]- Chú thích:

Value[i,w] là giá trị lớn nhất mà bạn có thể đạt được với i đối tượng và trọng lượng tối đa là w.

<small>Vi</small> là giá trị đồ I, <small>wi</small> là trọng lượng đồ i.<small>wi</small> duyệt qua tất cả các trọng lượng từ 0 đến w

- Giả sử tính được value[i,w] với mọi 1< i<n và 0 < w < Capacity. khi đó đểtính được value[i,w] như sau:

Nếu w < <small>wi</small> thì đồ vật thứ i khơng thể chất vào túi, do đó cách tối ưu có thể chọn là i-1 đồ vật trước đó và giá trị value[i-1,w].

Nếu w > <small>w</small> cách tối ưu cần chọn có 2 cách sau:

</div><span class="text_page_counter">Trang 29</span><div class="page_container" data-page="29">

Không chất đồ vật i vào túi. do đó cách tối ưu có thể 1,w].

value[i-chất đồ vật i vào túi . Khi đó trọng lượng cịn lại sẽ được value[i-chất tối ưu từ i-1 đồ vật đầu tiên với giá trị tối ưu sẽ là: value[i-1,w- <small>w</small><sub>i</sub> ]. Và giá trị sẽ được cập nhật <small>V</small><sub>i</sub><small>+value[i−1 , w-w</small>từ đó cơng thức đệ quy:

{

<small>value</small>[<small>i−1 ,w</small>]<small>vớiw≤ w</small><sub>i</sub>

<small>max</small>(<small>value</small>[<small>i−1 ,w</small>]<small>,</small>|<small>V</small><sub>i</sub><small>+value[i−1 , w-w</small><sub>i</sub><small>]¿</small>

<b>Quy luật chọn lựa tối ưu :</b>

- Nếu trọng lượng <small>w</small><sub>i</sub> của đối tượng thứ i lớn hơn trọng lượng tối đa w, bạn không thể đặt đối tượng này vào túi, vì nó vượt q trọng lượng tối đa.- Ngược lại, nếu <small>wi</small> ≤ w, bạn có hai lựa chọn:

<i>Khơng chọn đối tượng thứ i, do đó giá trị là </i><small>value</small>[<small>i−1 ,w</small>]

<i>Chọn đồ thứ i, tức là cộng thêm giá trị</i>

<small>Vivới giátrịlớnnhất cóthể đạt được từ</small> {<small>1 ,…i−1</small>}<small>và</small><i> trọng lượng </i><small>wi</small><i> vào giải pháp tối ưu cho các đối tượng trước đó với trọng lượng tối đa là w – </i><small>w</small><sub>i</sub><i>, do đó </i><small>V</small><sub>i</sub><small>+value[i−1 , w – w</small>

Ví dụ:

</div><span class="text_page_counter">Trang 30</span><div class="page_container" data-page="30">

<b> WI</b>

- Dynamic Programming (Weights [1 … N], Values [1 … N],

- Table [0 ... N, 0 … Capacity]) nó được sử dụng để lưu trữ kết quả từ thuật tốn lập trình động.

- Input:

Trọng số mảng chứa trọng số của tất cả các mụcGiá trị mảng chứa giá trị của tất cả các mục

</div><span class="text_page_counter">Trang 31</span><div class="page_container" data-page="31">

các giá trị tối ưu dựa trên việc liệu việc bao gồm mục hiện tại có dẫn đến giá trị cao hơn khơng.

</div><span class="text_page_counter">Trang 32</span><div class="page_container" data-page="32">

- Tạo một mảng selectedQuantities để lưu trữ lựa chọn (1 là chọn, 0 là không chọn).

- Nếu giá trị tại table[i][c] khác với giá trị khi không chọn mục (table[i - 1][c]), đánh dấu mục thứ i được chọn và giảm dung lượng còn lại.

- Trả về mảng số lượng đã chọn và giá trị tối ưu

</div><span class="text_page_counter">Trang 33</span><div class="page_container" data-page="33">

Độ phức tạp cho đoạn code:- Time complexity

[<small>1+…+1</small>]<small>¿¿¿ ¿¿Capacity∗</small>[<small>1+…+1</small>]<small>¿</small>

<small>¿Capacity N∗</small>

<small>¿O(Capacity∗N )</small>- Space complexity

Độ phức tạp không gian được chiếm bởi bảng 2 chiều, có kích thước (n + 1) với (capacity + 1). Do đó, độ phức tạp không gian là O(n * capacity).

Như vậy, độ phức tạp theo thời gian của thuật tốn Lập trình động là O (N*Capacity). Về mặt bộ nhớ, Lập trình động yêu cầu một mảng hai chiềuvới các hàng bằng số mục và cột bằng dung lượng của ba lô. Thuật tốn này có lẽ là một trong những thuật tốn dễ thực hiện nhất vì nó khơng u cầu sử dụng bất kỳ cấu trúc bổ sung nào.

<b>CHƯƠNG 4 – Xây Dựng data và hiện thực thuật toán</b>

- Bộ dữ liệu được lấy từ:

- Xây dựng các Data theo cấu trúc như hình

</div>

×