1042: [贪心] 纪念品分组

1042: [贪心] 纪念品分组


题目描述
元旦快到了,校学生会让三胖负责新年晚会的纪念品发放工作。为使得参加晚会的同学所获得 的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品, 并且每组纪念品的价格之和不能超过一个给定的整数。为了保证在尽量短的时间内发完所有纪念品,三胖希望分组的数目最少。

你的任务是写一个程序,找出所有分组方案中分组数最少的一种,输出最少的分组数目。

输入
第1行包括一个整数w,为每组纪念品价格之和的上限= 第2行为一个整数n,表示购来的纪念品的总件数G

第3-n+2行每行包含一个正整数Pi (5 <= Pi <= w3)w表示所对应纪念品的价格。

输出
仅1行,包含一个整数, ep最少的分组数目合

样例输入

100
9
90
20
20
30
50
60
70
80
90

样例输出

6

题目解析:
这是一道简单的关于贪心算法的题,思路很简单,为了尽量的选最合适的作为一组,我们把这些数据排序后,从最小的和最大的开始一次判断,如果加起来不超过上限,则把他们组合在一组,若超过了,再进行下一轮判断。只要合并一次,就记录下次数,最后再将那些无法和别的组成一组的数据的个数也加上,就可以解决了。

代码(已通过)

扫描二维码关注公众号,回复: 8982103 查看本文章
#include<iostream>
#include<cstdio>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
 
int main()
{
    int x,n,i,j,s=0;//x记录上限,n记录总数,s记录可分成的组//
    cin>>x;//输入上限//
    cin>>n;//输入总数//
    int a[n];
    for(i=0;i<n;i++)
        cin>>a[i];//输入各个数据//
    sort(a,a+n);//使用sort函数进行排序//
    for(i=0;i<n;i++){
        for(j=n-1;j>i;j--){//遍历循环//
            if(a[i]+a[j]<=x&&a[i]!=0&&a[j]!=0)//如果两个组队后之和未超过上限,则将他们组合到一起//
            {
                  s+=1;
                  a[i]=0;
                  a[j]=0;
                  break;//s+1,且将这两个数清0//
            }
 
        }
    }
 
    for(i=0;i<n;i++)//遍历循环,寻找未清0的数,让他们单独组成一组//
        if(a[i]!=0)
            s+=1;
    cout<<s;
    return 0;
}
发布了25 篇原创文章 · 获赞 20 · 访问量 3282

猜你喜欢

转载自blog.csdn.net/qq_44886056/article/details/100226426
今日推荐