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; } }