| 796 | // this is useful for checking weight requirements. |
| 797 | template <typename T1, typename T2> |
| 798 | inline static void ObtainMinMaxSum(const T1 *w, int nw, T1 *mi, T1 *ma, T2 *su) { |
| 799 | T1 minw; |
| 800 | T1 maxw; |
| 801 | T1 sumw; |
| 802 | int i; |
| 803 | if (nw & 1) { // odd |
| 804 | minw = w[0]; |
| 805 | maxw = w[0]; |
| 806 | sumw = w[0]; |
| 807 | i = 2; |
| 808 | } else { // even |
| 809 | if (w[0] < w[1]) { |
| 810 | minw = w[0]; |
| 811 | maxw = w[1]; |
| 812 | } else { |
| 813 | minw = w[1]; |
| 814 | maxw = w[0]; |
| 815 | } |
| 816 | sumw = w[0] + w[1]; |
| 817 | i = 3; |
| 818 | } |
| 819 | for (; i < nw; i += 2) { |
| 820 | if (w[i - 1] < w[i]) { |
| 821 | minw = std::min(minw, w[i - 1]); |
| 822 | maxw = std::max(maxw, w[i]); |
| 823 | } else { |
| 824 | minw = std::min(minw, w[i]); |
| 825 | maxw = std::max(maxw, w[i - 1]); |
| 826 | } |
| 827 | sumw += w[i - 1] + w[i]; |
| 828 | } |
| 829 | if (mi != nullptr) { |
| 830 | *mi = minw; |
| 831 | } |
| 832 | if (ma != nullptr) { |
| 833 | *ma = maxw; |
| 834 | } |
| 835 | if (su != nullptr) { |
| 836 | *su = static_cast<T2>(sumw); |
| 837 | } |
| 838 | } |
| 839 | |
| 840 | inline static std::vector<uint32_t> EmptyBitset(int n) { |
| 841 | int size = n / 32; |