博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【贪心策略】背包问题
阅读量:4091 次
发布时间:2019-05-25

本文共 1384 字,大约阅读时间需要 4 分钟。

问题描述:

给定n个物体(它们的重量为:w1,w2,......,wn,价值为:v1,v2,......,vn) 和 一个承受重量为W的背包,每种物体都可以分割。问怎么选取这些物体,放在的背包中(不超过背包的承重),让所取的子集达到最大价值。

贪心策略:

优先选取性价比最高的物体,也就是 vi/wi 最高的第 i 个物体。当然也有其他的策略,比如优先取 vi 最高的物体、优先取 wi 最低的物体从而尽可能存放更多的东西。

步骤设计:

1)对所有物体按照 vi/wi 进行排序,初始化最大价值maxValue = 0

2)如果背包还有容量的话(W > 0),首选比值较大的物体(vi,wi)。

若背包剩余容量W ≥ 比值最大的物体的总容量wi,则将物体(vi,wi)整个放入背包、W=W-wi、maxValue=maxValue+vi;

若背包剩余容量W < wi,则将剩下的空间都放入物体(vi,wi)的一部分、W=0、maxValue=maxValue+W / wi * vi。

代码实现:

// 贪心策略public class PkgProblemTest {	public static void main(String[] args) {		double[] w = {7, 3, 4, 5};      // 物体的重量		double[] v = {12, 12, 40, 25};  // 物体的价值		int W = 10;   // 背包承重		int n = 4;    // 物体个数				// 排序		for (int j=0; j<3; j++) {			int max = j;			for (int i=j+1; i<4; i++) {				if ( v[i]/w[i] > v[max]/w[max] ) {					max = i;				}			}						if (max != j) {				swap(v, max, j);				swap(w, max, j);			}		}				// 验证排序是否成功		for (int i=0; i<4; i++) {			System.out.print(v[i]/w[i] + "\t");		}		System.out.println();				// 计算最大价值		double maxValue = 0.0;		while (W > 0) {			for (int i=0; i<4; i++) {				if (w[i] > W) {  // 代码出口					maxValue += W/w[i] * v[i];					W = 0;					//break;				} else {					maxValue += v[i];					W -= w[i];				}			}		}				System.out.println("最大价值为:" + maxValue);			}		// 交换数组两个下标对应的值	public static void swap(double[] arr, int i, int j) {		double tmp = arr[i];		arr[i] = arr[j];		arr[j] = tmp;	}}

运行结果如下所示,

 

转载地址:http://obnii.baihongyu.com/

你可能感兴趣的文章
电机堵转
查看>>
carzepony也在想往FreeRTOS上迁移
查看>>
可以买个好点的电烙铁
查看>>
ACfly调参记录(包括ACfly-F330和ACfly-T265)
查看>>
一定记得每飞几次或者隔一天要把螺丝和浆帽拧一次,确实会松的
查看>>
《多旋翼无人飞行器嵌入式飞控开发指南》里基于FreeRTOS的无人机软件框架
查看>>
思岚A1的SDK其实很好读懂,每个函数清晰明了,可以直接调用
查看>>
串级 PID 为什么外环输出是内环的期望?(和我之前对串级PID的总结一样)
查看>>
我刚刚才完全清楚GPS模块的那根杆子是怎么固定安装好的
查看>>
去github里面找找也没有别人无人机+SLAM的工程
查看>>
现在明白为什么无名博客里好几篇文章在讲传感器的滞后
查看>>
Pixhawk解锁常见错误
查看>>
ROS是不是可以理解成一个虚拟机,就是操作系统之上的操作系统
查看>>
用STL algorithm轻松解决几道算法面试题
查看>>
ACfly之所以不怕炸机因为它觉得某个传感器数据不安全就立马不用了
查看>>
我发觉,不管是弄ROS OPENCV T265二次开发 SDK开发 caffe PX4 都是用的C++
查看>>
ROS的安装(包含文字和视频教程,我的ROS安装教程以这篇为准)
查看>>
原来我之前一直用的APM固件....现在很多东西明白了。
查看>>
realsense-ros里里程计相关代码
查看>>
似乎写个ROS功能包并不难,你会订阅话题发布话题,加点逻辑处理,就可以写一些基础的ROS功能包了。
查看>>