贪心法——乘船问题
乘船问题。有 n 个人,第
i 个人重量为 wi 。每艘船的最大载重量均为 C ,且最多只能乘两个人。用最少的船装载所有人。
贪心思路:每次取最轻值
乘船问题实现算法
// 贪心法
// 乘船问题
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
请输入船的最大载重量:5
第1个人的重量为:1
第2个人的重量为:2
第3个人的重量为:3
第4个人的重量为:4
第5个人的重量为:5
使用最少船的组合和总船数为:
组合为:5
组合为:1 4
组合为:2 3
请输入人的总数(0退出):5
请输入船的最大载重量:5
第1个人的重量为:1
第2个人的重量为:5
第3个人的重量为:5
第4个人的重量为:5
第5个人的重量为:5
使用最少船的组合和总船数为:
组合为:5
组合为:5
组合为:5
组合为:5
组合为:1
请输入人的总数(0退出):0
Process returned 0 (0x0) execution time : 14.700 s
Press any key to continue.