最优装载问题(贪心算法)

问题描述:

有一批集装箱要装上一艘载重量为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;
}

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WGS.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值