问题描述:
有一批集装箱要装上一艘载重量为c的轮船。其中集装箱i的重量为Wi。最优装载问题要求确定在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船。(意思就是在不超过载重量的情况下最多能装多少)
大体思路:
首先用数组承载每个集装箱的重量
为了方便,给数组排个序
循环小于集装箱数量方法一:每个重量累加判断是否超过载重量
方法二:定义剩余变量,剩余变量减每个的重量,然后判断每个的重量是否大于剩余重量
- 方法一
#include <iostream>
#include <iomanip>
#include <string.h>
#include <cmath>
#include <algorithm>//算法头文件
using namespace std;
void load_problem(double arrs[], int num, double c){//集装箱重量的数组、集装箱数量、载重量
//为数组赋值
cout<<"给每个集装箱的重量赋值:"<<endl;
for(int i=0; i<num; i++){
cin>>arrs[i];
}
//排序
/*
第一个参数是数组的首地址,一般写上数组名就可以,因为数组名是一个指针常量
第二个参数相对较好理解,即首地址加上数组的长度n(代表尾地址的下一地址)
默认可以不填,如果不填sort会默认按数组升序排序。也就是1,2,3,4排序。也可以自定义一个排序函数,改排序方式为降序什么的,也就是4,3,2,1这样。
*/
sort(arrs,arrs+num);
double tsum = 0.0; //承载已经装的重量
int temp = 0; //计数器
for(int i=0; i<num; i++){
tsum += arrs[i];
if(tsum < c){
temp++;
}else{
break;
}
}
cout<<"最多可装下:"<<temp<<endl;
}
int main(){
double c;//载重量
int num;//集装箱数量
cout<<"请输入载重量和集装箱数量:"<<endl;
cin>>c>>num;
double arrs[num];//承载每个集装箱重量的数组
load_problem(arrs,num,c);
return 0;
}
- 方法二
#include <iostream>
#include <iomanip>
#include <string.h>
#include <cmath>
#include <algorithm>//算法头文件
using namespace std;
void load_problem2(double arrs[], int num, double c){//集装箱重量的数组、集装箱数量、载重量
//为数组赋值
cout<<"给每个集装箱的重量赋值:"<<endl;
for(int i=0; i<num; i++){
cin>>arrs[i];
}
//排序
sort(arrs,arrs+num);
int temp = 0;
double currentSpace = c; //声明剩余空间
for(int i=0; i<num; i++){
if(currentSpace < arrs[i]){ //剩余空间小于当前重量
break;
}
currentSpace -= arrs[i];
temp++;
}
cout<<"最多可装下:"<<temp<<endl;
}
int main(){
double c;//载重量
int num;//集装箱数量
cout<<"请输入载重量和集装箱数量:"<<endl;
cin>>c>>num;
double arrs[num];//承载每个集装箱重量的数组
load_problem2(arrs,num,c);
return 0;
}