题意
传送门 NC 16640
题解
分组数最小,则分组总价格应该尽量逼近上界。考虑到价格上界较小,统计各个价位的纪念品个数。对于每一个价位 p i p_{i} pi,贪心地从价位 w − p i w-p_{i} w−pi 开始向下枚举,要特殊处理枚举到 p i p_{i} pi 价位的情况,复杂度 O ( w 2 ) O(w^2) O(w2)。
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
using namespace std;
#define maxw 205
int num[maxw];
int main()
{
int w, n, maxp = 0;
scanf("%d%d", &w, &n);
for (int i = 0; i < n; i++)
{
int p;
scanf("%d", &p);
num[p]++;
maxp = max(maxp, p);
}
int res = 0;
for (int i = maxp; i >= 0; i--)
{
int limit = w - i;
for (int j = limit; j >= 0; j--)
{
if (num[i] == 0)
break;
if (i == j)
{
res += num[i] / 2;
num[i] &= 1;
}
else
{
int d = min(num[i], num[j]);
num[i] -= d, num[j] -= d, res += d;
}
}
res += num[i], num[i] = 0;
}
printf("%d\n", res);
return 0;
}