阅读完此题,你会发现,解决此题的关键是如何让两个数“尽可能”相加成一个值,这个值要小于等于w(w为每组纪念品价格之和的上限),所以,我们要做的是便是如何“凑出”这个数,我们可以先把这些数放入一个数组中,然后通过数组中的sort()方法对数组进行排序,使其从小到大的排列,接下来我们要做的是“凑数”,我们可以利用两个for循环,i的那一层循环控制数组头指针,j的那一层循环控制数组尾指针,使得s[i]+s[j]<=w;满足的我们便用计数器进行计数,并且s[i]、[j]重新赋值0,代表已经组队,对不满足s[i]+s[j]<=w的我们先进行“预留”,后期再用for循环进行遍历,这些“预留的数”都是为单个数(无法组队),所以我们再用计数器自加一即可完成此题
import java.util.*; public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
int w=sc.nextInt();
int n=sc.nextInt();
int[] s=new int[n];
int count=0;
for(int i=0;i<n;i++) {
s[i]=sc.nextInt();
}
Arrays.sort(s);
for(int i=0;i<n-1;i++) {
for(int j=n-1;j>i;j--) {
if(s[i]+s[j]<=w && s[i]>=5 && s[j]>=5) {
s[i]=0;
s[j]=0;
count++;
j=i;
}
}
}
for(int i=0;i<n;i++) {
if(s[i]>=5) {
count++;
}
}
System.out.print(count+" ");
}
}