版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37014990/article/details/79995565
问题:
海盗们截获了一艘装满各种各样古董的货船,每一件古董都价值连城,一旦打碎就失去了它的价值。虽然海盗船足够大,但载重量为C,每件古董的重量为w,海盗们该如何把尽可能多数量的宝贝装上海盗船呢?
看到问题后,得知,海盗船的载重量为C,每件古董的重量为w。
船的容量是固定的,那么优先把重量小的古董先装入,则可以尽可能多装入古董数量。
算法思路:
一,将重量为w的古董,按照重量升序排序,即由小到大排序。
二,从小到大装入容量为C的船,知道不能装入为止。
代码,直接贴上,java.
public static int loadNumber(int[] arr, int c){
//参数检查
if(arr == null || c < 0) return -1;
//装入古董数
int count = 0;
//当前容量
int temp = 0;
for(int i = 0; i < arr.length; i++){
temp += arr[i];
if(temp <= c){
count++;
}
}
return count;
}
public static void main(String[] args) {
int n;
//容量
int c;
Scanner in = new Scanner(System.in);
System.out.println("输入抢到的古董数:");
n = in.nextInt();
System.out.println("输入船的容量:");
c = in.nextInt();
int[] arr = new int[n];
for(int i = 0; i < n; i++){
System.out.println("输入第" + (i + 1) + "古董的重量");
arr[i] = in.nextInt();
}
//排序
Arrays.sort(arr);
System.out.println("排序后数组:" + Arrays.toString(arr));
int count = loadNumber(arr, c);
System.out.println("装入古董数:" + count);
}
讲到这里:loadNumber方法还有第二种实现:
/**
* 实现二
*/
public static int loadNumber2(int[] arr, int c){
//参数检查
if(arr == null || c < 0) return -1;
//记录已经装载的古董数
int count = arr.length;
//当前容量
int temp = 0;
for(int i = 0, len = arr.length; i < len; i++){
temp += arr[i];
if(temp >= c){
//刚好满,最后一个可以装入
if(temp == c){
count = i + 1;
}else{ //大于,则最后一个不可装入
count = i;
}
break;
}
}
return count;
}