UVa 1149 (贪心) Bin Packing

首先对物品按重量从小到大排序排序。

因为每个背包最多装两个物品,所以直觉上是最轻的和最重的放一起最节省空间。

考虑最轻的物品i和最重的物品j,如果ij可以放在一个包里那就放在一起。

否则的话,j只能自己单独放在一个包里,因为最轻的都不行,其他物品就更不可能和j放在一起了。

如果j可以和多个物品放在一起,那么j和最轻的i放一起,剩下的一定能和除j外最重的放一起。

 1 #include <cstdio>
 2 #include <algorithm>
 3 using namespace std;
 4 
 5 const int maxn = 100000 + 10;
 6 int a[maxn];
 7 
 8 int main()
 9 {
10     //freopen("in.txt", "r", stdin);
11 
12     int T; scanf("%d", &T);
13     for(int kase = 0; kase < T; kase++)
14     {
15         if(kase) puts("");
16         int n, l;
17         scanf("%d%d", &n, &l);
18         for(int i = 0; i < n; i++) scanf("%d", &a[i]);
19         sort(a, a + n);
20         int head = 0, rear = n - 1, cnt = 0;
21         while(head <= rear)
22         {
23             cnt++;
24             if(head == rear) head++;
25             else if(a[head] + a[rear] <= l) { head++; rear--; }
26             else rear--;
27         }
28         printf("%d
", cnt);
29     }
30 
31     return 0;
32 }
代码君
原文地址:https://www.cnblogs.com/AOQNRMGYXLMV/p/4447158.html