Thuật toán Ứng dụng — DP, String, Big Data & hơn nữa
~15 phútQuyết định dưới constraint — DP, Greedy, BacktrackingAll-Access

Bài toán cái túi — 0/1 Knapsack, Unbounded và nén bộ nhớ

Knapsack chọn món đồ có tổng giá trị lớn nhất trong giới hạn W. Nắm 0/1 knapsack (dp[i][w] 2D → 1D), unbounded, vì sao greedy sai, và liên hệ coin change.

TL;DR: Bài toán cái túi (knapsack) hỏi: chọn một tập món đồ (item) sao cho tổng weight không vượt W và tổng value lớn nhất. Với 0/1 knapsack (mỗi món dùng tối đa 1 lần), DP 2D dp[i][w] là giá trị tốt nhất khi xét i món đầu với sức chứa w. Transition: chọn hoặc không chọn món thứ i. Nén xuống 1D bằng cách duyệt w từ W xuống 0. Greedy (chọn theo tỉ lệ value/weight) sai với 0/1 knapsack, và một counter-example đơn giản là đủ để bác bỏ.

Một công ty logistics phải chọn đơn hàng nào để xếp vào chuyến xe tải 1.000 kg cuối ngày. Mỗi đơn hàng có trọng lượng và lợi nhuận riêng. Mục tiêu: lời nhiều nhất mà không vượt tải trọng. Đơn hàng không chia nhỏ được, mỗi đơn hoặc lấy hết hoặc bỏ qua. Đó đúng là cấu trúc của 0/1 Knapsack.

Cùng khuôn này gặp ở danh mục đầu tư (chọn dự án với ngân sách cố định), cache (object nào giữ trong RAM) hay scheduling (task nào làm trong giờ làm việc).

1. Hình dung: packer thông minh so với packer tham lam

Cứ hình dung hai nhân viên xếp hàng vào kho:

  • Packer tham lam luôn chọn món có tỉ lệ value/weight cao nhất. Nghe có lý, nhưng hay bị kẹt: chọn món đắt và khá nặng xong thì hết chỗ cho hai món nhẹ, rẻ mà cộng lại còn lời hơn.
  • Packer DP nghĩ khác: "Nếu còn w kg và tôi đang xét món thứ i, thì lựa chọn tối ưu là gì?" Mỗi quyết định nhỏ được lưu lại để dựng nên quyết định lớn hơn.
Chuyện xếp khoTrong DP
Món hàng, trọng lượng, lợi nhuậnitem i, weight[i], value[i]
Tải trọng xe còn lạisức chứa w
Sổ ghi của packer DPdp[i][w]
Bỏ món / lấy mónhai nhánh của max

2. Phát biểu bài toán và ký hiệu

Cho n món đồ (item), món i có:

  • weight[i]: trọng lượng (số nguyên dương)
  • value[i]: giá trị (số nguyên dương)

Và sức chứa tối đa W. Tìm tập con các món có tổng weight không vượt W và tổng value lớn nhất.

0/1 knapsack: mỗi món dùng tối đa 1 lần (lấy hoặc bỏ). Unbounded knapsack: mỗi món dùng được nhiều lần tuỳ ý.

All-Access Pass

Phần còn lại của bài dành cho All-Access Pass

Bạn vừa đọc phần xem trước. Hai bài đầu của mỗi khoá luôn đọc trọn miễn phí.

  • Đọc trọn mọi bài trong 6 khoá System Design và dữ liệu phân tán
  • AI Mentor trả lời theo toàn bộ nội dung bài
  • Trả một lần, không tự gia hạn, không tự trừ tiền

Trọn đời

1.690.000 ₫

Trả một lần, dùng mãi mãi

Gói năm

699.000 ₫

365 ngày · ≈ 58.000 ₫/tháng

Thanh toán bằng thẻ Visa/Master/JCB qua Polar. Xem bảng giá

Đã mua? Đăng nhập để đọc tiếp

Bài này có giúp bạn hiểu bản chất không?

Bài này đáng gửi cho bạn học cùng?

Copy link đã gắn nguồn — dán group, chat, hoặc LinkedIn.

Thảo luận & góp ý

Hỏi đáp về bài này

Bài tiếp theo

Greedy — Tham lam có chứng minh: Interval Scheduling và Huffman