【贪心法】--最优装载问题
1、最优装载问题
有一批集装箱要装上一艘载重量为c的轮船。其中集装箱i的重量为Wi。最优装载问题要求确定在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船。
问题可以描述为:
2、算法分析
【时间复杂度&&优化】
该算法只用一层循环,时间复杂度是O(n);
【算法精髓】
解决最优装载问题之前,需要把所有物体按重量从小到大排序;
该算法使用了include <algorithm>里自带的 sort(w, w + n)函数,每次向轮船里放物品也按照按物体重量从小到大的顺序向里面放
【最优量度标准】
若当前要放物品的重量小于当前轮船的剩余容量,则可放进去,同时打印输出该物品的重量值
【源代码】
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
// 贪心法
// 最优装载问题
void optionalLoad(int w[], int n, int C) {
sort(w, w + n);//把所有物体按重量从小到大排序
int retain = C;//retain记录当前剩余容量
for(int i = 0; i < n; i++) {
if(w[i] <= retain) {
cout << w[i] << " ";
retain -= w[i];
}
}
cout << endl;
}
int main() {
while(true) {
// n个物体
int n;
int x[n+1];
cout << "请输入物体总数(0退出):";
cin >> n;
if(!n) {
break;
}
int C;//轮船的载重
cout << "请输入不超过的总重量:";
cin >> C;
int w[n];//各个物品的重量
cout << "分别输入" << n << "个物体的重量:";
for(int i = 0; i < n; i++) {
cin >> w[i];
}
cout << "最优装载为:" << endl;
optionalLoad(w, n, C);
cout<<"贪心选择结果为:"<<endl;
for(int i=0; i<=n; i++)
{
cout<<x[i]<<" ";
}
cout<<endl;
}
return 0;
}