贪心法——乘船问题

贪心法——乘船问题

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

贪心思路:每次取最轻值 wmin 和最重值 wmax ,如果 wmin+wmaxC wmin 为次最轻值, 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.

你可能感兴趣的:(算法,算法竞赛,贪心法,乘船问题)