P1094 纪念品分组

题目链接

P1094 纪念品分组

题目梗概

现有一堆纪念品,每个纪念品有其自己的价值。我们需要把这些纪念品分组,但每组纪念品的价值和不能超过上限W,求在该规则下,能分成的最少组数是多少。

解题思路

每组的纪念品价值和都要尽可能的接近上限。
做法是,每次先取当前价值最大和价值最小的组合,如果还有限度,再取剩下中价值最小的,直至不能再添加为止。

完整代码

#include 
#include 
#include 
using namespace std;
int main(){
	int w,n;
	cin >> w >> n;
	vector<int> a(n);
	for(int i = 0;i<n;i++){
		cin >> a[i];
	}
	sort(a.begin(),a.end());
	int ans = 0, tmp = 0;
	int i = 0, j = n - 1;
	while(i <= j){
		tmp = a[j];
		j--;
		while(tmp + a[i] <= w){
			tmp += a[i++]; 
		}
		++ans;
	}
	cout << ans;
	return 0;
}

你可能感兴趣的:(洛谷)