过河问题(贪心)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_43909184/article/details/90050599

有n个人过河,每个人重量weight不同,有船的最大载重为size(最多容纳2人)
问所有人过河需要几条船?
使用贪心算法,先将体重从轻到重排列(冒泡),然后从最重的与最轻的相加,大于载重则一人乘一条船,小于等于载重则两人乘坐一条船,依次如此得到船数.

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
//冒泡排序
void bubble(int* data, int num) {
	int i, j, tmp;
	for (i = 0; i < num; ++i) {
		for (j = 0; j < num - 1 - i; ++j) {
			if (data[j] > data[j + 1]) {
				tmp = data[j];
				data[j] = data[j + 1];
				data[j + 1] = tmp;
			}
		}
	}
}
int main() {
	int size, num;
	int weight[20] = { 0 };
	int i, j, sum = 0, count = 0;
	printf("请输入人数num 船的容量size:\n");
	scanf("%d %d", &num, &size);
	printf("请分别输入每个人的重量:\n");
	for (i = 0; i < num; ++i) {
		scanf("%d", weight + 1);
	}
	bubble(weight, num);
	//两个指针分别指向最重和最轻,最重的指针向前扫描
	//与最前的相加,如果小于容量则船数+1,大于容量则容量直接+1,指针继续向前
	for (i = 0, j = num - 1; i <= j; j--) {
		if (weight[i] + weight[j] <= size) {
			++i;
		}
		++count;
	}
	printf("共需要%d条船\n", count);
	system("pause");
	return 0;
}


在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43909184/article/details/90050599