五大算法之贪心法

本贴最后更新于 2898 天前,其中的信息可能已经斗转星移

问题:一个旅行者有一个最多能用c公斤的背包,现在有n件物品,每件的重量分别是w1,w2,...,wn,每件的价值分别为v1,v2,...,vn,若每种物品都可无限细分,求旅行者能获得的最大总价值。

抽象:组合出价值最大的指定重量的物品。

思路:先求出每个物品的价值密度,先放入价值密度最大的物品,再放入剩余物品价值密度最大的物品,依次进行,直到背包已满。

代码:

package test;

import java.util.Arrays;

/**

  • 贪心法求背包问题(可分割)
  • @author yanghang

*/
public class Tanxin {

public static void main(String[] args) {
	/**
	 * 初始化
	 */
	// 背包的容量
	double c = 12;
	// 物品的数量
	int n = 5;
	// 物品重量数组
	double[] w = new double[n];
	// 物品价钱数组
	double[] v = new double[n];
	// 物品的重量  1,2,3,4,5
	for (int i = 0; i < n; i++) {
		w[i] = i + 1;
	}
	// 物品的价值 5,4,3,2,1
	for (int i = 0; i < n; i++) {
		v[i] = n - i;
	}
	
	/**
	 * 求出单位重量价值r[i] = v[i] / w[i]
	 * 
	 */
	double[] r = new double[n];
	int[] index = new int[n];
	for (int i = 0; i < n; i++) {
		r[i] = (double) v[i] / (double) w[i];
		index[i] = i;
	}

	/**
	 * 按照价值密度排序
	 */
	double temp = 0;
	for (int i = 0; i < n - 1; i++) {
		for (int j = i + 1; j < n; j++) {
			if (r[i] < r[j]) {
				temp = r[i];
				r[i] = r[j];
				r[j] = temp;
				temp = w[i];
				w[i] = w[j];
				w[j] = temp;
				temp = v[i];
				v[i] = v[j];
				v[j] = temp;
			}
		}
	}

	/**
	 * 初始化解向量x[n],求解并打印解向量
	 */
	double[] x = new double[n];
	for (int i = 0; i < n; i++) {
		if (w[i] <= c) {
			x[i] = 1;
			c = c - w[i];
		} else if (w[i] > c) {
			x[i] = (double)c / w[i];
			c = 0;
			break;
		}
	}
	System.out.println("解向量是:" + Arrays.toString(x));
	
	
	/**
	 * 根据解向量求出背包中存放物品的最大价值并打印
	 */
	double maxValue = 0;
	for (int i = 0; i < n; i++) {
		maxValue += v[i] * x[i];
	}
	System.out.println("背包中物品的最大价值为:" + maxValue);

}

}

 

  • 算法
    428 引用 • 254 回帖 • 24 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • donychen

    无意中看到这个帖子,对其中的算法思路不是很理解。
    // 背包的容量 double c = 12;
    // 物品的数量 int n = 5;
    // 物品的重量 1,2,3,4,5
    // 物品的价值 5,4,3,2,1
    用最简单的思路想一下,重量为 1 的物品价值是 5。
    换句话,重量最轻的物品最贵,那么我只要装 12 个重量为 1 的商品,就能获得 12*5=60 的最大价值。
    根据你的程序输出:
    解向量是:[1.0, 1.0, 1.0, 1.0, 0.4]
    背包中物品的最大价值为:14.4
    为什么?

推荐标签 标签

  • 房星科技

    房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。

    6 引用 • 141 回帖 • 586 关注
  • DevOps

    DevOps(Development 和 Operations 的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

    48 引用 • 25 回帖 • 1 关注
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖 • 2 关注
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 645 关注
  • 程序员

    程序员是从事程序开发、程序维护的专业人员。

    568 引用 • 3532 回帖
  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    334 引用 • 323 回帖 • 1 关注
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖 • 2 关注
  • Swagger

    Swagger 是一款非常流行的 API 开发工具,它遵循 OpenAPI Specification(这是一种通用的、和编程语言无关的 API 描述规范)。Swagger 贯穿整个 API 生命周期,如 API 的设计、编写文档、测试和部署。

    26 引用 • 35 回帖 • 1 关注
  • 职场

    找到自己的位置,萌新烦恼少。

    127 引用 • 1705 回帖
  • HHKB

    HHKB 是富士通的 Happy Hacking 系列电容键盘。电容键盘即无接点静电电容式键盘(Capacitive Keyboard)。

    5 引用 • 74 回帖 • 472 关注
  • CodeMirror
    1 引用 • 2 回帖 • 131 关注
  • Webswing

    Webswing 是一个能将任何 Swing 应用通过纯 HTML5 运行在浏览器中的 Web 服务器,详细介绍请看 将 Java Swing 应用变成 Web 应用

    1 引用 • 15 回帖 • 633 关注
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    8158 引用 • 37199 回帖 • 161 关注
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    20 引用 • 23 回帖 • 720 关注
  • 电影

    这是一个不能说的秘密。

    121 引用 • 601 回帖
  • 工具

    子曰:“工欲善其事,必先利其器。”

    286 引用 • 729 回帖
  • GAE

    Google App Engine(GAE)是 Google 管理的数据中心中用于 WEB 应用程序的开发和托管的平台。2008 年 4 月 发布第一个测试版本。目前支持 Python、Java 和 Go 开发部署。全球已有数十万的开发者在其上开发了众多的应用。

    14 引用 • 42 回帖 • 763 关注
  • Swift

    Swift 是苹果于 2014 年 WWDC(苹果开发者大会)发布的开发语言,可与 Objective-C 共同运行于 Mac OS 和 iOS 平台,用于搭建基于苹果平台的应用程序。

    36 引用 • 37 回帖 • 531 关注
  • sts
    2 引用 • 2 回帖 • 195 关注
  • WebSocket

    WebSocket 是 HTML5 中定义的一种新协议,它实现了浏览器与服务器之间的全双工通信(full-duplex)。

    48 引用 • 206 回帖 • 335 关注
  • Eclipse

    Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。

    75 引用 • 258 回帖 • 621 关注
  • 心情

    心是产生任何想法的源泉,心本体会陷入到对自己本体不能理解的状态中,因为心能产生任何想法,不能分出对错,不能分出自己。

    59 引用 • 369 回帖 • 1 关注
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖
  • 游戏

    沉迷游戏伤身,强撸灰飞烟灭。

    176 引用 • 815 回帖
  • ngrok

    ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。

    7 引用 • 63 回帖 • 627 关注
  • Openfire

    Openfire 是开源的、基于可拓展通讯和表示协议 (XMPP)、采用 Java 编程语言开发的实时协作服务器。Openfire 的效率很高,单台服务器可支持上万并发用户。

    6 引用 • 7 回帖 • 96 关注
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    209 引用 • 358 回帖 • 1 关注