贪心策略之最优装载问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
	}





猜你喜欢

转载自blog.csdn.net/qq_37014990/article/details/79995565