贪心法——乘船问题

原创 2016年06月01日 16:14:32

贪心法——乘船问题

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

贪心思路:每次取最轻值wmin和最重值wmax,如果wmin+wmaxCwmin为次最轻值,wmax为次最重值。否则wmax为次重值。

乘船问题实现算法

// 贪心法
// 乘船问题
void boat(float *a, int n, float C) {
    sort(a, a + n);
    int i = 0;
    int j = n - 1;
    int boatSum = 0;
    while(i <= j) {

        if(i == j) {
            cout << "组合为:" << a[i] << endl;
            boatSum++;
            break;
        }

        if(a[i] + a[j] <= C) {
            cout << "组合为:" << a[i] << " " << a[j] << endl;
            boatSum++;
            i++;
            j--;
        } else {
            cout << "组合为:" << a[j] << endl;
            boatSum++;
            j--;
        }
    }
}

测试主程序

#include <iostream>
#include <algorithm>

using namespace std;

// 贪心法
// 乘船问题
void boat(float *a, int n, float C) {
    sort(a, a + n);
    int i = 0;
    int j = n - 1;
    int boatSum = 0;
    while(i <= j) {

        if(i == j) {
            cout << "组合为:" << a[i] << endl;
            boatSum++;
            break;
        }

        if(a[i] + a[j] <= C) {
            cout << "组合为:" << a[i] << " " << a[j] << endl;
            boatSum++;
            i++;
            j--;
        } else {
            cout << "组合为:" << a[j] << endl;
            boatSum++;
            j--;
        }
    }
}

int main() {
    while(true) {
        // n个人
        int n;
        cout << "请输入人的总数(0退出):";
        cin >> n;
        if(!n) {
            break;
        }
        float C;
        cout << "请输入船的最大载重量:";
        cin >> C;
        float a[n];
        for(int i = 0; i < n; i++) {
            cout << "第" << i + 1 << "个人的重量为:";
            cin >> a[i];
        }

        cout << "使用最少船的组合和总船数为:" << endl;
        boat(a, n, C);
    }
    return 0;
}

输出数据

请输入人的总数(0退出):5
请输入船的最大载重量:51个人的重量为:12个人的重量为:23个人的重量为:34个人的重量为:45个人的重量为:5
使用最少船的组合和总船数为:
组合为:5
组合为:1 4
组合为:2 3
请输入人的总数(0退出):5
请输入船的最大载重量:51个人的重量为:12个人的重量为:53个人的重量为:54个人的重量为:55个人的重量为:5
使用最少船的组合和总船数为:
组合为:5
组合为:5
组合为:5
组合为:5
组合为:1
请输入人的总数(0退出):0

Process returned 0 (0x0)   execution time : 14.700 s
Press any key to continue.
版权声明:如需转载,请联系本人获取许可且必须注明出处,详见联系方式。

贪心法——乘船问题

贪心法——乘船问题 乘船问题。有nn个人,第ii个人重量为wiw_i。每艘船的最大载重量均为CC,且最多只能乘两个人。用最少的船装载所有人。 贪心思路:每次取最轻值wminw_{min}和最重值w...
  • q547550831
  • q547550831
  • 2016年06月01日 16:14
  • 1341

NYOJ 71 独木舟上的旅行 贪心算法 之 乘船问题

独木舟上的旅行 时间限制:3000 ms  |  内存限制:65535 KB 难度:2      描述 进行一次独木舟的旅行活动,独木舟可以在港口租到,并且之间没有区别。一条独木舟最多只能乘坐两个人...
  • LYHVOYAGE
  • LYHVOYAGE
  • 2013年01月20日 11:12
  • 4779

贪心法:乘船问题

描述 进行一次独木舟的旅行活动,独木舟可以在港口租到,并且之间没有区别。一条独木舟最多只能乘坐两个人,且乘客的总重量不能超过独木舟的最大承载量。我们要尽量减少这次活动中的花销,所以要找出可以安置所有...
  • gao1440156051
  • gao1440156051
  • 2015年11月15日 10:55
  • 875

ACM:贪心法:乘船问题。

题目:有n个人,第i个人的重量为wi,每艘船的最大载重量均为C,且最多只能乘两个人。用最少的船装载所有人。 分析:贪心法!            考虑最轻的人i,他应该和谁一起坐呢?如果每个人都无法和...
  • u010470972
  • u010470972
  • 2014年06月11日 21:54
  • 1229

技巧与错误(4)

14.错误      昨天模拟考,在提交的前一分钟发现自己的并查集忘了写路径压缩了,顿时一身冷汗……引以为戒! 15.错误     模拟考第二题,DP的时候发现数组的开反了,f[205][205][4...
  • l975744425
  • l975744425
  • 2016年11月02日 08:06
  • 278

51nod-独木舟问题

n个人,已知每个人体重,独木舟承重固定,每只独木舟最多坐两个人,可以坐一个人或者两个人。显然要求总重量不超过独木舟承重,假设每个人体重也不超过独木舟承重,问最少需要几只独木舟? 输入 ...
  • Cai_Nia
  • Cai_Nia
  • 2016年08月13日 17:19
  • 175

贪心法——乘船问题

题目大致是: 有n个人,第i个人的重量为w[i],每艘船的最大载重量均为c,且最多只能乘两个人。用最少的船装载所有人。 解: 首先从最轻的人开始考虑,那么他应该和最重的人去坐,如果每个人都不能和...
  • ACMer_hades
  • ACMer_hades
  • 2015年03月05日 22:15
  • 915

贪心算法_乘船问题

描述  进行一次独木舟的旅行活动,独木舟可以在港口租到,并且之间没有区别。一条独木舟最多只能乘坐两个人,且乘客的总重量不能超过独木舟的最大承载量。我们要尽量减少这次活动中的花销,所以要找出可以安置所有...
  • q361239731
  • q361239731
  • 2015年11月24日 20:43
  • 523

【11.6十一月第一周总结】

本周总结: 本周的原定计划是贪心算法的学习,看了小白书上面的贪心算法章节内容; 分有以下几种情况:1.最优装载问题   2.部分背包问题  3.乘船问题                        ...
  • baidu_35643793
  • baidu_35643793
  • 2016年11月06日 22:15
  • 126

NYOJ - 71 - 独木舟上的旅行(乘船问题)

描述 进行一次独木舟的旅行活动,独木舟可以在港口租到,并且之间没有区别。一条独木舟最多只能乘坐两个人,且乘客的总重量不能超过独木舟的最大承载量。我们要尽量减少这次活动中的花销,所以要找出可以安置所有旅...
  • qq_34594236
  • qq_34594236
  • 2016年10月18日 08:23
  • 331
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:贪心法——乘船问题
举报原因:
原因补充:

(最多只允许输入30个字)