Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int s = sc.nextInt();
int index = 0;
int num = 0;
int[][] x = new int[n][2];
for (int i = 0; i < n; i++) {
for (int j = 0; j < 2; j++) {
x[i][j] = sc.nextInt();
}
}
for (int i = 0; i < n; i++) {
if (s < x[i][1]) { //如果这一位不满足
if(i!=n-1) { // 如果不是最后一位
if (s >= x[i + 1][1]) { //判断是否大于所需要的积木数
s = (s - x[i + 1][1]) + x[i + 1][0] + x[i + 1][1]; // 给小朋友,然后拿到所有积木
index++; // 拍照+1
}
}
}
}
int len = n-index; // 减去已经拍过照的
for (int i = 0; i < len; i++) { // 回溯
if (s < x[i][1]) { // 判断是否小于当前需要的积木数
if(i!=len-1) { // 判断是否是最后一位
if (s >= x[i + 1][1]) { // 判断是否大于下一位的积木数
s = (s - x[i + 1][1]) + x[i + 1][0] + x[i + 1][1]; // 拿到所有积木
num++; // 个数+1
}
}
}else { // 否则
s = (s - x[i][1]) + x[i ][0] + x[i ][1]; //直接拿到所有积木数
num++; // 个数+1
}
}
System.out.println(index+num); // 输出所有
}
}
总结,贪心算法就是求局部的最优解,每当当前解集不满足我们所需要的解时,跳过整个解集,转而去找其他的条件,判断是否满足我们所需要的解,再一步一步回溯。
来源:https://blog.csdn.net/WXZCYQ/article/details/102777976