思路:题目考察的是贪心问题,对贪心的概念模糊不清了,于是又重新回顾了下,贪心还是力度不够啊,回去还要好好刷几题!!
题目的思路就是:
1)先将给定的价格分个类
2)分别从排好的序列的头部和尾部开始,将它们的价钱相加,如果小于等于给定的w。就表示可以组成一组,否则就单独的将最大的作为一组!!
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int main() {
int w,n;
cin >>w>> n;
int *ptr = new int[n];
/*输入每个纪念品的价格*/
for (int i = 0; i < n;i++) {
cin >> ptr[i];
}
//将这组数从小到大排序用sort()函数
sort(ptr,ptr+n);
/*分别从第一个和最后一个开始,如果两个数的和小于等于w就将它们放入一组
如果大于了,就将大的那一个单独的放一组!!
*/
int i = 0; int j = n - 1; int count = 0;
while (i<=j){//??等号是否会造成影响?? 会的,当匹配到最后就剩一个的时候
if (ptr[i]+ptr[j]<=w) {//说明可以构成一组
//j--;
i++;//构成一组后应该是i++
}
j--;//如果不能构成一组的话大的就单独成一组
count++;
}
cout << count << endl;
delete []ptr;
return 0;
}