贪心法——乘船问题

来源:互联网 发布:哈尔滨华德学院网络科 编辑:程序博客网 时间:2024/05/11 01:28

贪心法——乘船问题

乘船问题。有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退出):0Process returned 0 (0x0)   execution time : 14.700 sPress any key to continue.
0 0
原创粉丝点击