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

问题描述:

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

在这里插入图片描述

最优装载问题是运筹学中的一个问题,通常用于解决货物分配到车辆上的问题,以便最大化装载效率或最小化运输成本。贪心算法是一种启发式策略,它在每一步选择局部最优解,希望最终能得到全局最优解。在C语言中,我们可以使用贪心算法解决0-1背包问题的一个简化版本,比如沃夫曼(Wolfram's Algorithm)。 下面是一个简单的贪心算法示例,假设我们要找一种方式装载物品,每个物品有自己的重量w[i]和价值v[i],目标是使装载的总价值最大,同时不超过给定的最大载重capacity: ```c #include <stdio.h> #include <stdlib.h> // 贪心函数,判断是否可以添加物品i int can_add(int i, int weight[], int value[], int capacity, int total_weight) { if (total_weight + weight[i] <= capacity) { return value[i]; } else { return 0; } } // 贪心算法实现 void knapsack_greedy(int n, int weight[], int value[], int capacity) { int* items = malloc(n * sizeof(int)); // 保存哪些物品被选中 int total_value = 0; // 总价值 for (int i = 0; i < n; ++i) { if (can_add(i, weight, value, capacity, total_weight)) { items[i] = 1; total_weight += weight[i]; total_value += value[i]; } } printf("Max value with greedy approach: %d\n", total_value); printf("Items selected: "); for (int i = 0; i < n; ++i) { if (items[i]) { printf("%d ", i); } } printf("\n"); free(items); } int main() { int n, capacity; scanf("%d %d", &n, &capacity); int weight[n], value[n]; // 输入物品信息 for (int i = 0; i < n; ++i) { scanf("%d %d", &weight[i], &value[i]); } knapsack_greedy(n, weight, value, capacity); 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、付费专栏及课程。

余额充值