贪心思想之过河问题(有n个人,每条船最多只能坐两个人、最大载重量是max,求最少需要几条船)

游戏规则: 

有n个人,每条船最多只能坐两个人、最大载重量是max,求最少需要几条船。

话不多说,先看代码。

#include<stdio.h>
#include<stdlib.h>
//贪心思想,过河问题。
void bubble(int arr[], int n)
{
	int i = 0;
	int j = 0;
	for (i=0; i < n; ++i)
	{
		for (j = 0; j < n - 1 - i; ++j)
		{
			if(arr[j] > arr[j+1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
			
	}
	for (i = 0; i < n; ++i)
	{
		printf("%d ", arr[i]);
	}
}
int main()
{
	int i = 0;
	int j = 0;
	int count = 0;
		int sum = 0;
		printf("请输入人数\n");
		int n = 0;//表示人数
		scanf("%d", &n);
		printf("请输入船的最大载重量\n");
		int max = 0;//载重量
		scanf("%d", &max);
		int arr[20] = { 0 };
		printf("输入%d个人的质量\n", n);
		for (i = 0; i < n; ++i)
		{
			scanf("%d", arr + i);//键入人的重量
		}
		bubble(arr,n);
		printf("\n");
		for (i = 0, j = n - 1;i<=j ;)
		{
			if (arr[i] + arr[j] < max)
			{
				i++;
				j--;
				++count;
			}
			else
			{
				j--;
				++count;
			}
		}
		printf("%d \n", count);
	system("pause");
	return 0;
}

思路讲解:

这道题是贪心思想的问题,首先还应该对人的重量进行排序。然后将最大重量的人和最小重量的人体重和进行比较,如果超了,给体重大的一条船,再和体重第二大的人比较。直到全部过完。

解法如下:

for (i = 0; i < n; ++i)
		{
			scanf("%d", arr + i);//键入人的重量
		}
		bubble(arr,n);
		printf("\n");
		for (i = 0, j = n - 1;i<=j ;)
		{
			if (arr[i] + arr[j] < max)
			{
				i++;
				j--;
				++count;
			}
			else
			{
				j--;
				++count;
			}
		}

 

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: {70, 80, 60, 50, 30, 20, 10}; 最大载重量 c = 100) 这是一道经典的贪心算法问题,可以采用贪心策略来解决。 首先将人按照体重从小到大排序,然后从体重最轻的人开始,依次选择与其体重最重的人一起乘,直到不能再加入更多的人或者所有人都已经乘。 具体实现可以使用双指针的方法,即设置左右个指针,分别指向体重最轻的人和体重最重的人,然后不断移动指针,直到所有人都已经乘。 代码实现如下: int n = 7; int w[] = {70, 80, 60, 50, 30, 20, 10}; int c = 100; sort(w, w + n); // 将人按照体重从小到大排序 int ans = ; // 记录的数量 int left = , right = n - 1; // 左右指针 while (left <= right) { if (w[left] + w[right] <= c) { // 如果可以一起乘 left++; // 左指针右移 right--; // 右指针左移 } else { // 如果不能一起乘 right--; // 右指针左移 } ans++; // 的数量加一 } cout << ans << endl; // 输出最少需要的数量 输出结果为 4,即最少需要 4 艘才能装载所有人。 ### 回答2: 要最少来装载所有人,首先我们需要确定每艘最大载重量。由于最多只能个人,因此我们可以将 n 个人体重从小到大排序,然后从体重最轻的人开始,搭配体重最重的人,作为一组上,如果这组人的体重和超过了最大载重量 c,则不能上需要找到下一组最大的可以上的人。然后再按照同样的方式搭配下一组人。 接下来我们考虑如何用程序实现这个问题。我们可以使用贪心算法,先将人的体重排序,然后从头开始遍历,不断选择最轻的可以上的人和最重的可以上的人,直到没有人可以上为止。 具体实现如下: 1. 定义一个列表 w 存储每个人体重,并将它们从小到大排序。 2. 定义一个变量 boats 表示使用的数,初始值为 0。 3. 定义变量 i 和 j 分别表示轻重个指针的位置,初始值均为 0。 4. 循环遍历 n 次(即遍历所有人),每次循环判断: - 如果 i >= j,则说明已经没有可以上的人,退出循环。 - 如果 w[i] + w[j] <= c,则将这个人放在同一艘上,并将 i 和 j 分别加 1。 - 如果 w[i] + w[j] > c,则不能将这个人放在同一艘上,只能体重较重的人单独放在一艘上,并将 j 减 1。 - 每次放人时,boats 加 1。 5. 输出 boats 的值,即使用的数。 整代码如下: ``` w = [60, 70, 80, 90, 100, 110, 120] # 七个人体重 w.sort() # 排序 n = len(w) # 人数 c = 150 # 最大载重量 i, j = 0, n - 1 # 轻重指针 boats = 0 # 使用的数 while i <= j: if i == j: boats += 1 break elif w[i] + w[j] <= c: i += 1 j -= 1 boats += 1 else: j -= 1 boats += 1 print("使用的数为:", boats) ``` 运行结果为 4,即需要使用 4 艘才能装载所有人。 ### 回答3: 这道题是一个很经典的贪心算法问题,可以使用贪心思想,寻找最优解。 首先,个人体重总和一定要小于等于最大载重量c,因此,我们需要将人按体重从小到大排序。可以使用快速排序等方式。 接着,我们从最轻的人开始,选择和他体重最大的人一起乘出发。比如说,第一个人体重为w[0],那么我们在剩余的人中选择体重最大的人w[i],使得w[0]+w[i]<=c,一起乘出发。假如没有符合条件的人,那么第一个人就要单独乘出发。然后,我们在剩余的人中重复以上步骤,直到所有人都乘为止。 在这个过程中,我们要注意的是,每当选择一个人,就需要从剩余的人中删除这个人,因为只能个人。另外,如果只有一个人剩余,那么这个人必须单独乘出发。 这样,我们就可以用最少,装载所有人。 具体实现可以参考以下代码: ```python def boat(n, c, w): w.sort() # 将人按体重从小到大排序 i, j = 0, n - 1 # 设置头尾指针 count = 0 # 记录的数量 while i <= j: if w[i] + w[j] <= c: # 选取体重最大个人一起上 i += 1 j -= 1 else: # 如果无法同时上只能选择体重大的人单独上 j -= 1 count += 1 return count n = 7 c = 12 w = [1, 2, 5, 6, 7, 8, 9] print(boat(n, c, w)) # 输出结果为3 ``` 以上代码的时间复杂度为O(nlogn),主要是排序的时间复杂度。在实际应用中,还可以采用其他排序算法来提高效率,比如说桶排序等。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值