纪念品分组

纪念品分组

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;
}
全部评论

相关推荐

03-02 16:31
已编辑
合肥工业大学 golang
程序员鼠鼠_春招版:学历可以,项目普通,评价多余,奖项没有,如果有面试都是因为学历给你的,我建议可以随便包几个奖项上去,像什么蓝桥杯天梯赛,虽然不一定有用,但是相比acm这种风险小多了,我几段实习下来,压根没查的,第二点是包一段小厂实习,大厂你不好拿捏,小厂打打杂也能让你在26里面出彩一点
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务