Solutions of Knapsack - MarisaOJ: Marisa Online Judge

Solutions of Knapsack

Select solution language

Write solution here.


peter_nguyen    Created at    1 likes

# Ý tưởng Bài toán yêu cầu chọn một tập con các món đồ sao cho: Tổng cân nặng ≤ S và giá trị tổng là lớn nhất. Với n ≤ 20, ta có thể duyệt toàn bộ các tập con của n món (tối đa 2^n ≈ 1 triệu, chạy được). ## Ta viết hàm đệ quy dequy(idx, g, s) với: idx: chỉ số món đang xét. g: tổng cân nặng hiện tại. s: tổng giá trị hiện tại. ## Ở mỗi bước: Không chọn món idx → sang món idx+1. Chọn món idx nếu g + w[idx] ≤ S → sang món idx+1 với cân nặng và giá trị mới. Khi idx > n, cập nhật kết quả ans = max(ans, s). ## code tham khảo, nên tự viết lại, không nên copy bạn nhé!!! ```cpp #include <bits/stdc++.h> #define io ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define FOR(i, a, b, k) for(int i = a; i <= b; i += k) using namespace std; int n; long long S, w[22], v[22], ans; void dequy(int idx, long long g, long long s) { if (g > S) return; if (idx == n+1) { ans = max(ans, s); return; } ///không chọn món thứ idx dequy(idx+1, g, s); ///chọn món thứ idx if (g + w[idx] <= S) dequy(idx+1, g + w[idx], s + v[idx]); } void sol() { cin >> n >> S; FOR(i, 1, n, 1) cin >> w[i] >> v[i]; ans = 0; dequy(1, 0, 0); cout << ans; } int main() { io #define NAME "test" if (fopen(NAME".inp", "r")) { freopen(NAME".inp", "r", stdin); freopen(NAME".out", "w", stdout); } sol(); return 0; } ```