n个件物品,有容量为m的背包,每包最多装两件物品,问最少用几个背包?
一种做法是枚举一个,二分另一个。
另一种做法如下。匹配一个最大的,用最小的就可以,这样肯定是最优的。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#define maxn 100010
using namespace std;
int main()
{
int cases, a[maxn];
cin >> cases;
for (int ca = 1; ca <= cases; ca++)
{
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> a[i];
sort(a+1, a+1+n);
int ans = 0, x = 1, y = n;
while (x <= y)
{
if (a[x]+a[y] <= m) x++;
y--;
}
cout << n-y << endl;
if (ca !=cases) cout << endl;
}
}