随机小礼品

发布时间 2023-04-16 18:42:36作者: 去移动互联吧

题目描述

元旦快到了,校学生会让 SM 负责新年晚会的小礼品发放工作。为使得参加晚会的同学所获得的小礼品价值相对均衡,他要把购来的小礼品根据价格进行分组,但每组最多只能包括两件小礼品,并且每组小礼品的价格之和不能超过一个给定的整数。为了保证在尽量短的时 间内发完所有小礼品,SM 希望分组的数目最少。
你的任务是写一个程序,找出所有分组方案中分组数最少的一种,输出最少的分组数目。

 

输入格式

输入包含n+2 行:
第 1 行包括一个整数w,为每组小礼品价格之和的上限。
第 2 行为一个整数n,表示购来的小礼品的总件数。
第 3~n+2 行每行包含一个正整数pi (5 <= pi <= w),表示所对应小礼品的价格。

 

输出格式

输出仅一行,包含一个整数,即最少的分组数目。

 

样例输入

100

9

90

20

20

30

50

60

70

80

90

样例输出

6

 

代码

#include <iostream>
#include <algorithm>
using namespace std;
int w;
int n,i,j;
int count=0;
int sum=0;
int main( )
{
  int i;
  int count=0;
  cin>>w>>n;
  int a[n];
  for(int i=0;i<n;i++)
   {
    cin>>a[i];
   }
    sort(a,a+n);           //排序函数sort,由小到大排序
    j=n-1;
    i=0;
    while(a[i]!=0)
   {
     sum=a[i]+a[j];

     if(sum>w)             //两个物品价格总和大于上限,单独成组
    {
     count++;
     a[j]=0;
     j--;
     }

     if(sum<=w)            //价格上限范围内为一组
    {
     a[i]=0;
     a[j]=0;
     i++;
     j--;
    count++;
    }
  }

  cout<<count<<endl;
  return 0;
}

 

//组数最小:

1.尽量两两组队

2.组队尽量接近上限——最便宜和最贵