乘船问题(贪心算法)
问题描述
乘船问题:有N个人,第I个人重量为wi,每艘船的载重上限为C,且最多乘2人。用最少的船装载所有人,求需最少的船数量。
解题思路
首先我们确定该题的要求是:求需最少的船数量,这就要求我们必须保证每一艘船都装载最大。
由于条件最多乘2人限制,和每一艘船至少可以乘坐一个人的条件,我们可以如此设计。
选择最轻和最重乘客与C进行比较,如果大于C则表示最重乘客无法与其他人同乘,就可以先坐一艘船先走,如小于等于C这直接两个人坐一艘船,船数量加一。
剩下的人重复以上操作,直到所有人全部运送完成。
伪代码设计
Begin
int[] w //所有人的重量
int c // 船的载重上限
int s = 0 // 船的数量
sort(w) // 排序
int i = 0
int j = w.length - 1
//只有考虑完所有船时,结束循环
while i <= j
if (w[i] + w[j] <= c)
i++
j--
s++ //每次循环船的数量+1
}
Print "需最少的船数量"+s
End
编程实验
public static void main(String[] args) {
//所有人的重量
int[] w = {5, 6, 3, 7, 3, 8, 7, 3, 4, 9};
// 船的载重上限
int c = 10;
// 船
int s = 0;
// 排序
Arrays.sort(w);
int i = 0;
int j = w.length - 1;
while (i <= j) {
if (w[i] + w[j] <= c) {
i++;
}
j--;
s++;
}
}
结果
第1次:9
第2次:8
第3次:3 7
第4次:3 7
第5次:4 6
第6次:5 6