Switch的博客

分享并记录所学所见

贪心法——乘船问题

贪心法——乘船问题

乘船问题。有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.
阅读更多
版权声明:如需转载,请联系本人获取许可且必须注明出处,详见联系方式。 https://blog.csdn.net/q547550831/article/details/51556875
个人分类: ACM
上一篇贪心法——部分背包问题
下一篇贪心法——选择不相交区间
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭