纪念品分组
纪念品分组
http://www.nowcoder.com/questionTerminal/a8a143aa6b7c4cd3813e4e5e98540213
很明显就是一道关于背包的贪心问题
那么根据贪心策略 固定容量的背包,装多样物品,使得背包数最小
首先把大的装入背包,如果能匹配到一个最小的,他们的和小于容量就是优解 因为之前的最小的,会为后面稍大的提供空间,否则剩余的会超出容量达不到最优
(我记得紫书上有讲)
#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; }