`
yeshaoting
  • 浏览: 686177 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

贪心算法 - 三种贪心选择策略 - 求解0-1背包问题

阅读更多

贪心算法能解决背包问题,但是不能解决0-1背包问题.

用算法问解0-1背包问题时,其解不一定是最优解,得到的可能是近似最优解.

根据选择的贪心策略选择的不同,得到的近似最优解也不尽相同.

 

/*
@author jarg
@TODO 贪心算法 - 求解0-1背包问题
贪心策略: 1. 单价 2. 重量 3. 单位价值
*/

import java.util.*;

public class Knapsack
{
	public static int m = 10;						// 背包容量
	public static int n = 4;						// 物品个数
	public static int[] w = {7, 3, 4, 5};			// 物品重量
	public static int[] v = {12, 12, 40, 25};		// 物品单价

	/* 排序结果 */
	public static int[] sort = new int[n];
	public static int[] choice = new int[n];

	public static void main(String[] args)
	{
		greedyByValue();
		greedyByWeight();
		greedyByPrice();
		System.out.println("");
	}

	/* 单价贪心策略 type:0 */
	public static void greedyByValue()
	{
		System.out.println("-单价贪心策略:");
		choice(0);
	}

	/* 重量贪心策略 type:1 */
	public static void greedyByWeight()
	{
		System.out.println("-重量贪心策略:");
		choice(1);
	}

	/* 单位价值贪心策略 type:2 */
	public static void greedyByPrice()
	{
		System.out.println("-单位价值贪心策略:");
		choice(2);
	}

	public static void choice(int type)
	{
		sort(type);
		//display(choice);

		int tempW = 0;
		for(int i=0;i<n;i++)
		{
			tempW = tempW + w[choice[i]];
			if(tempW<m)
			{
				sort[i] = choice[i];
			}
			else
			{
				sort[i] = -1;
			}
		}
		display(sort);
		
	}

	/* 排序 */
	public static void sort(int type)
	{
		int[] temp = getTempData(type);
		
		for(int i=0;i<n;i++)
		{
			choice[i] = i;
		}

		for(int i=0;i<n-1;i++)
		{
			for(int j=i+1;j<n;j++)
			{
				if(temp[j]>temp[i])
				{
					int t = choice[j];
					choice[j] = choice[i];
					choice[i] = t;

					t = temp[j];
					temp[j] = temp[i];
					temp[i] = t;
				}
			}
		}
		
	}

	public static int[] getTempData(int type)
	{
		/* 待排序的数据 */
		int[] temp = new int[n];
		if(type == 0)
		{
			temp = v;
		}
		else if(type == 1)
		{
			temp = w;
		}
		else
		{
			for(int i=0;i<n;i++)
			{
				temp[i] = v[i]/w[i];
			}
		}
		return temp;
	}

	public static void display(int[] value)
	{
		int sumv = 0;
		System.out.print("choice: ");
		for(int i=0;i<n;i++)
		{
			if(sort[i] == -1)
			{
				break;
			}
			sumv = sumv + v[sort[i]] * w[sort[i]];
			System.out.print(sort[i] + "\t");
		}
		System.out.println();
		for(int i=0;i<n;i++)
		{
			if(sort[i] == -1)
			{
				break;
			}
			System.out.println("w[" + sort[i] + "]: " + w[sort[i]] + "\tv[" + sort[i] + "]: " + v[sort[i]]);
		}
		System.out.println("总价值: " + sumv + "\n");
	}
}

 

 

今天浑浑噩噩度过了一下,看贪心算法求解0-1背包问题,不知道思考.

试着写程序,做一半就做不下去.耗了很久.

最终还是决定坚持代码完整性,即使这个程序写得很滥.

分享到:
评论

相关推荐

    0-1背包问题(贪心算法)C语言源程序

    ### 0-1背包问题(贪心算法)C语言源程序解析 #### 一、问题背景及概述 0-1背包问题是一种经典的组合优化问题,在实际应用中有着广泛的应用场景,比如物流分配、资源调度等领域。该问题的核心是:给定一系列物品...

    贪心算法解决0-1背包问题

    总的来说,贪心算法提供了一种求解0-1背包问题的有效方式,尤其适用于那些对求解时间有较高要求或问题规模较大的情况。它以局部最优解作为基础,通过简单直观的策略,可以在较短时间内找到一个不错的解决方案。但...

    贪心算法 背包问题 c语言

    但需要注意的是,并非所有问题都适合使用贪心算法求解,只有满足贪心选择性质和最优子结构性质的问题才可采用贪心算法。 #### 二、背包问题概述 背包问题是一类经典的组合优化问题,其基本形式为:给定一系列物品...

    贪心算法背包问题(非0-1)

    在非0-1背包问题中,贪心算法通过计算每种物品的价值重量比(即单位重量所能获得的价值),然后按此比率降序排序,优先选取单位重量价值比最高的物品,直至背包容量用尽或所有物品都被考虑过为止。 **4. C语言实现...

    算法设计-贪心算法-背包问题

    背包问题.本算法比较清晰,易读。运行后自动出结果。 背包问题是比较经典的算法。...在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。

    0-1背包问题贪心算法(C++实现)

    ### 0-1背包问题与贪心算法:C++实现详解 #### 一、问题背景与定义 在计算机科学与运筹学中,0-1背包问题是一个经典的组合优化问题。该问题描述为:给定一系列物品,每个物品都有一个重量和一个价值,以及一个背包...

    贪心算法解0-1背包问题

    贪心算法是计算机科学中解决问题的一种策略,它通过在每一步选择局部最优解来尝试达到全局最优解。在0-1背包问题中,这种策略尤为适用。0-1背包问题是一个经典的组合优化问题,它的目标是在容量有限的背包中放入物品...

    0-1背包贪心算法求解

    0-1背包问题的特殊之处在于每种物品只能选择0个或1个,不能部分选取。 贪心算法是一种解决问题的方法,它每次做出当前看起来最优的选择,希望通过局部最优解逐步达到全局最优解。然而,对于0-1背包问题,贪心策略并...

    用贪心算法实现背包问题

    贪心算法是解决这类问题的一种策略,它通过每一步选择局部最优解来期望得到全局最优解。在这个场景中,我们将探讨如何使用Java编程语言,结合贪心算法,来解决背包问题。 首先,我们要理解贪心算法的基本思想。贪心...

    算法大作业0-1背包问题求解六种方法综述.zip

    0-1背包问题是一种经典的组合优化问题,在计算机科学和运筹学中有着广泛的应用。它描述的是这样的场景:你有一组物品,每件物品都有一个重量和一个价值,你需要选择一部分物品放入容量有限的背包中,使得背包内物品...

    一种改进的模拟退火算法求解0-1背包问题

    ### 一种改进的模拟退火算法求解0-1背包问题 #### 背景与问题定义 0-1背包问题是一种经典的NP完全问题,在工程、经济、资源分配等领域广泛应用。该问题的核心在于如何在有限的背包容量下,从一组物品中选择若干...

    C++应用贪心算法求解背包问题

    ### C++应用贪心算法求解背包问题 #### 一、背景介绍 背包问题是一种经典的组合优化问题,在实际生活中有着广泛的应用,例如物流规划、资源分配等场景。背包问题主要分为两种类型:0-1背包问题和分数背包问题。本...

    带权重的贪心萤火虫算法求解0-1背包问题

    参考文献:任静敏,潘大志《带权重的贪心萤火虫算法求解0-1背包问题》,用MATLAB实现改进萤火虫算法(WGFA),对基本的萤火虫算法进行改进,加入线性递减惯性权重,用贪心算法修复不可行解,加入变异算子提高全局...

    动态规划法、贪心算法、回溯法、分支限界法解决0-1背包

    贪心算法在背包问题中可以找到应用,但不适用于0-1背包问题。因为贪心策略通常是选择当前最优的物品,即价值密度最高的物品,然而这种策略无法保证在0-1背包问题中得到全局最优解。0-1背包问题要求物品要么全选要么...

    Python基于贪心算法解决背包问题示例

    对于背包问题,贪心算法适用于完全背包问题,但对于0-1背包问题,贪心算法不一定能得到最优解。 - 在实际应用中,需要根据具体情况选择合适的算法。 - 对于背包问题,动态规划也是一种常用的解决方法,适用于更广泛...

    贪心算法 部分背包问题

    贪心算法是计算机科学中解决问题的一种策略,它通过做出局部最优选择来逐步达到全局最优解。在部分背包问题中,这种策略尤其适用。部分背包问题是一个经典的优化问题,经常出现在运筹学、算法设计和分析中。在此问题...

    0-1背包问题贪心算法源码下载

    贪心算法是解决0-1背包问题的一种策略。贪心算法的基本思想是在每一步决策时都采取当前状态下最好或最优的选择,希望以此达到全局最优解。在0-1背包问题中,贪心策略是优先选择单位重量效益最高的物品,即p[i]/w[i]...

    贪心算法贪心算法背包问题

    贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择策略,以便产生全局最优解的算法。然而,值得注意的是,贪心算法并不总是能得到全局最优解,它在某些特定情况下才能保证找到最优解。 ...

    背包问题的贪心算法,背包问题的贪心解法

    然而,贪心算法在解决非0-1背包问题时却能够发挥其优势。当问题的结构允许分割物品时,比如分数背包问题,我们可以将物品分割成更小的单位,这种情况下贪心算法能够得到全局最优解。这是因为背包问题中的物品可以被...

    贪心算法求解背包问题

    在“贪心算法求解背包问题”中,我们面临的是一个经典的资源分配问题,即如何在有限的资源(背包的承重W)内最大化价值。这个问题根据是否能部分选取物品分为离散(0-1)背包问题和连续背包问题。 离散(0-1)背包...

Global site tag (gtag.js) - Google Analytics