1. 程式人生 > >貪心算法-- 紀念品分組

貪心算法-- 紀念品分組

compare gpo 數據 包括 希望 main 獲得 相對 進行

問題描述
  元旦快到了,校學生會讓樂樂負責新年晚會的紀念品發放工作。為使得參加晚會的同學所獲得的紀念品價值 相對均衡,他要把購來的紀念品根據價格進行分組,但每組最多只能包括兩件紀念品,並且每組紀念品的價格之和不能超過一個給定的整數。為了保證在盡量短的時 間內發完所有紀念品,樂樂希望分組的數目最少。
  你的任務是寫一個程序,找出所有分組方案中分組數最少的一種,輸出最少的分組數目。
輸入格式
  輸入包含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 數據規模和約定   50%的數據滿足:1 <= n <= 15   100%的數據滿足:1 <= n <= 30000, 80 <= w <= 200

思路:這個問題在於選擇,我想最多的情況是每一個都要一個袋子,

就是把從大到小排序,最大的最校的結合就可以了

#include <iostream>
#include <algorithm>
using namespace std;
int a[30002];
bool compare(int a,int b)
{
	return a>b;
}
int main()
{
	int m;
	int n;
	int c=0;
	int i;
	int j;
	cin>>m;
	cin>>n;
	for(int k=0;k<n;k++)
	{
		cin>>a[k];
	}
	sort(a,a+n,compare);//<<<<<

    i=0;j=n-1;
    while(i<=j)
    {
     	if(a[i]+a[j]<=m)
     	{
     		i++;
     		j--;
		 }
		 else
		 i++;
		 c++;
	}
  cout<<c<<endl;
	return 0;
}

  

貪心算法-- 紀念品分組