很明显就是一道关于背包的贪心问题
那么根据贪心策略 固定容量的背包,装多样物品,使得背包数最小
首先把大的装入背包,如果能匹配到一个最小的,他们的和小于容量就是优解 因为之前的最小的,会为后面稍大的提供空间,否则剩余的会超出容量达不到最优
(我记得紫书上有讲)
#include <bits/stdc++.h>
#define ll int
using namespace std;
ll a[30010];
bool vis[30010];///标记数组
int main()
{
ll we;
cin>>we;
ll n;
cin>>n;
for (int i=0;i<n;++i)cin>>a[i];
sort(a+0,a+n);///从小到大排序
ll cnt=0;
ll j=0;
ll k=n-1;///双指针从中取大物品的同时,匹配到合适的小物品
for (;;++j)
{
if (j>=k)
break;
for (;;--k)
{
if (a[j]+a[k]<=we)
{
++cnt;
vis[j]=vis[k]=1;///标记已经放入背包
--k;
break;
}
}
}
for (int i=0;i<n;++i)
{
if (vis[i]==0)++cnt;///处理剩余的单个装入背包中的
}
cout<<cnt<<endl;
return 0;
}


京公网安备 11010502036488号