算法题:纪念品分组 - 贪心

描述

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

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

【限制】

50%的数据满足: 1 <=n <= 15

100%的数据满足: 1 <= n <= 30000, 80 <= W <= 200

格式

输入格式

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

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

输出格式

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

样例1

样例输入1

100
9
90
20
20
30
50
60
70
80
90

样例输出1

6

限制

各个测试点1s


解题思路(贪心策略):

1)将纪念品价值从小到大排序

2)从最大价值的纪念品开始遍历,寻找与其之和最接近w的一组,并将他们在数组中移除。如果找不到,即1个为1组。

参考代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;

class Main
{
    public static void main(String[] argv)
    {
        try {
            InputStreamReader inputStream = new InputStreamReader(System.in);
            BufferedReader buffer = new BufferedReader(inputStream);

            int w = Integer.parseInt(buffer.readLine());
            int n = Integer.parseInt(buffer.readLine());
            ArrayList<Integer> ep = new ArrayList<Integer>();
            for (int i = 1; i <= n; i++) {
                ep.add(new Integer(buffer.readLine()));
            }
            Collections.sort(ep);
            int total = 0;
            while (ep.size() > 0) {
                Integer max = ep.remove(ep.size() - 1);
                total++;
                for (int index = 0; index < ep.size(); index++) {
                    if (index == ep.size() -1) {
                        if (ep.get(index) + max <= w) {
                            ep.remove(index);
                            break;
                        }
                    } else {
                        Integer min = ep.get(index);
                        Integer minMore = ep.get(index + 1);
                        if (min + max <= w && minMore + max > w) {
                            ep.remove(index);
                            break;
                        }
                    }
                }
            }

            System.out.println(total);
        } catch (Exception ex) {
            System.out.println("Error:" + ex.getMessage());
        }
    }
}




猜你喜欢

转载自blog.csdn.net/loophome/article/details/79269895
今日推荐