贪心法——乘船问题

原创 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.
版权声明:如需转载,请联系本人获取许可且必须注明出处,详见联系方式。

相关文章推荐

贪心法:乘船问题

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

乘船问题(贪心小白书)

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

ACM:贪心法:乘船问题。

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

UVa 10622 - Perfect P-th Powers(数论)

#include #include #include #include #include #include using namespace std; int find(int n) {...
  • a197p
  • a197p
  • 2015年06月16日 21:05
  • 485

贪心法——最优装载问题

贪心法——最优装载问题 最优装载问题。给出nn个物体,第ii个物体重量为wiw_i。选择尽量多的物体,使得总重量不超过CC。 只关心物体的数量,这样只需把所有物体按重量从小到大排序,依次选取每个物...

算法竞赛入门经典:第八章 高效算法设计 8.16贪心之乘船问题

/* 乘船问题: 有n个人,第i个人重量为Wi。每艘船的最大载重量均为C,且最多只能乘两个人。用最少的船装载所有人。 分析: 若最轻的人与任何人都不能一起坐,那么没人独坐 否则,应该选择...

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

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

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

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

贪心法——区间覆盖问题

贪心法——区间覆盖问题 区间覆盖问题。数轴上有n个闭区间[ai,bi][a_i, b_i],选择尽量少的区间覆盖一条指定线段[s,t][s,t]。 先进行预处理,将不包含[s,t][s,t]的区间...

贪心法——部分背包问题

贪心法——部分背包问题 部分背包问题。有nn个物体,第ii个物体的重量为wiw_i,价值为viv_i。在总重量不超过CC的情况下让总价值尽量高。每一个物体都可以只取走一部分,价值和重量按比例计算。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:贪心法——乘船问题
举报原因:
原因补充:

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