C语言乘船问题(贪心算法)

【问题描述】

有n个人,第i个人的重量为wi,每艘船的最大载重量为c;且每个船最多只能乘坐两个人,用最少的船装载所有的人。

【分析】

选择最轻的人,让最重的人和他乘同一个船(贪心);

如果这两个人的总重量不超过最大载重量,则一起乘船(i++,j--,num++);

若两个人总重量超过最大载重量,则让最重的人独自乘船(j--,num++);

应先将这些人的重量由小到大排序(sort函数)。

【代码】

#include <stdio.h>
#include <algorithm>
using namespace std;
main(){
    int num=0;
    int c,n;
    int w[1000];
    printf("请输入人数(不为0):");
    scanf("%d",&n) ;
    printf("请输入船的最大载重量:");
    scanf("%d",&c);
    for(int i=0;i<n;i++){
        printf("请输入第%d人的重量:",i+1) ; 
        scanf("%d",&w[i]);
    }
    sort(w,w+n);                           //将重量由小到大排列 
    int i=0,j=n-1;
    while(i<j){
        if(w[i]+w[j]<=c){                  //如果两个人重量和小于船,则上船 
        i++;
        j--;
        num++;
    }
    else{
        if(w[j]<c){                        //如果两个人重量和大于船,则让重量大的独自乘船 
            j--;
            num++;
        }
        else j--;                          //如果重量大的那个人比船还要重,则不乘船 
    }
}
    if(i==j&&w[i]<=c){                     //最后一个人 乘船 
        num++;
    }
    printf("最少需要的船数为:%d",num) ;
}

  • 8
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回溯算法是一种求解排列、组合等组合优化问题的常用算法,可以用来求解乘船问题。具体算法流程如下: 1.将人按体重从小到大排序。 2.定义一个数组used记录每个人是否已经被乘船。 3.从第一个人开始遍历,依次把每个人加入中,直到达到最大载重或者已满两人为止。 4.如果已满两人,那么尝试把中的人卸载,并尝试把下一个未乘船的人加入中。 5.如果所有人都已经被乘船,那么记录当前数,如果当前数比已知的最小数要小,则更新最小数。 6.回溯到上一个状态,尝试下一个人。 下面是Python代码实现: ```python def backtrack(n, w, C): w.sort() # 按体重排序 used = [0] * n # 记录每个人是否已经乘船 min_boat_num = float("inf") # 初始化最小数为正无穷 def dfs(cur, cur_weight, cur_boat_num): nonlocal min_boat_num if cur_boat_num >= min_boat_num: # 如果当前数已经大于已知的最小数,则剪枝 return if cur == n: # 如果所有人都已经乘船,则记录当前数并更新最小数 min_boat_num = min(min_boat_num, cur_boat_num) return if not used[cur]: # 如果当前人未乘船 used[cur] = 1 # 标记当前人已乘船 if cur_weight + w[cur] <= C: # 尝试把当前人放入中 dfs(cur + 1, cur_weight + w[cur], cur_boat_num) for i in range(cur + 1, n): # 尝试把当前人和后面的人放入中 if not used[i] and cur_weight + w[cur] + w[i] <= C: used[i] = 1 dfs(cur + 1, cur_weight + w[cur] + w[i], cur_boat_num + 1) used[i] = 0 used[cur] = 0 # 回溯到上一个状态 dfs(0, 0, 0) return min_boat_num ``` 在主函数中输入人数n、每个人体重w和最大载重量C,并调用backtrack函数求解最少的数。 ```python if __name__ == "__main__": n = 6 w = [2, 3, 5, 1, 4, 6] C = 10 min_boat_num = backtrack(n, w, C) print(min_boat_num) ``` 输出结果为2,即最少需要2艘才能装载所有人。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值