Processing math: 91%
Solutions of Knapsack - MarisaOJ: Marisa Online Judge

Solutions of Knapsack

Select solution language

Write solution here.


bean    Created at    11 likes

Có khoảng tối đa 2T các giá trị w khác nhau trong mảng, vậy ta có thể đếm số lần một giá trị w xuất hiện. Gọi ci là số lần giá trị wi xuất hiện với i[1,T] Khi này bài toán sẽ trở thành bài toán knapsack cổ điển như sau: cho các cặp giá trị wici, hỏi ta có thể tạo ra x từ các cặp số này hay không? Biết rằng mỗi wi được sử dụng tối đa ci lần. Nó sẽ gần giống với bài này: https://marisaoj.com/problem/156 Với mỗi giá trị i, ta chia nhỏ ci thành tổng của 2x sao cho cộng lại bằng đúng ci, với mỗi giá trị 2x, ta sẽ có thể tạo thành giá trị wi2x. Độ phức tạp sẽ là O(T2T) Do chúng ta chỉ cần kiểm tra xem việc tạo thành i là thực hiện được hay không, ta có thể dùng bitset để thực hiện các thao tác tính toán một cách nhanh hơn, giảm được độ phức tạp xuống O(T2T32) Code tham khảo: cpp#cludebits/stdc++.husingnamespacestd;bitset<()1e6+1>dp;ma(){c.tie(0)syncwithstdio(0);n,T;cnT;r<>w(n);for(i=0;i<n;i++){cw[i];}sort(w.beg(),w.end());dp[0]=1;for(i=0;i<n;){nxt=upperbound(w.beg(),w.end(),w[i])-w.beg();c=nxt-i;for(k=1;c>0;k=1){x=min