`
mynaAo7I
  • 浏览: 12544 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

背包问题基础

 
阅读更多

直接贴代码

/**
 * 背包问题
 * @author 
 *
 */
public class PackDemo {
	/**
	 * V 最大容量
	 * 
	 */
	public static int V = 6;
	/**
	 * N 包个数
	 */
	public static int N = 3;
	/**
	 * packs[i][0]表示物品重量
	 * packs[i][1]表示物品价值
	 * i表示第i个物品 
	 * 
	 */
	int[][] packs = {
			{1,2},{4,2},{4,3}
	};

	public static void main(String[] args) {
		System.out.println("0-1背包问题解:" + new PackDemo().Pack1());
		System.out.println("完全背包问题解:" + new PackDemo().Pack2());
		PackDemo pd = new PackDemo();
		
		int value = pd.Pack3();
		if(value == Integer.MIN_VALUE)
			System.out.println("0-1背包问题解:无解" );
		System.out.println("0-1背包问题解:" + new PackDemo().Pack3());
		System.out.println("完全背包问题解:" + new PackDemo().Pack4());

	}
	
	/**
	 * 完全背包 恰好装满
	 * @return
	 */
	public int Pack4(){
		/**
		 * F[v]含义 表示容量为v的包中在给定的物品下可以获得最大价值
		 * 
		 */
		int[] F = new int[V + 1];
		
		F[0] = 0;
		for(int i = 1; i <= V; i++){
			F[i] = Integer.MIN_VALUE;
		}
		
		for(int i = 0; i < N; i++){
			CompletePackForTotal(F, packs[i][0], packs[i][1]);
		}
		return F[V];
	}
	
	private void CompletePackForTotal(int[] F, int C, int W){
		for(int v = C; v <= V; v++)
			F[v] = max(F[v], F[v - C] + W);
	}
	
	
	/**
	 * 01背包 恰好装满
	 * @return
	 */
	public int Pack3(){
		int[] F = new int[V + 1];
		F[0] = 0;
		for(int i = 1; i <= V; i++){
			F[i] = Integer.MIN_VALUE;
		}
		for(int i = 0; i < N; i++){
			ZeroOnePackForTotal(F, packs[i][0], packs[i][1]);
		}
		return F[V];
	}
	
	private void ZeroOnePackForTotal(int[] F, int C, int W){
		for(int v = V; v >= C; v--)
			F[v] = max(F[v], F[v - C] + W);
	}
	
	/**
	 * 完全背包
	 * @return
	 */
	public int Pack2(){
		/**
		 * F[v]含义 表示容量为v的包中在给定的物品下可以获得最大价值
		 * 
		 */
		int[] F = new int[V + 1];
		for(int i = 0; i <= V; i++){
			F[i] = 0;
		}
		for(int i = 0; i < N; i++){
			CompletePack(F, packs[i][0], packs[i][1]);
		}
		return F[V];
	}
	
	private void CompletePack(int[] F, int C, int W){
		for(int v = C; v <= V; v++)
			F[v] = max(F[v], F[v - C] + W);
	}
	
	
	/**
	 * 01背包
	 * @return
	 */
	public int Pack1(){
		int[] F = new int[V + 1];
		for(int i = 0; i <= V; i++){
			F[i] = 0;
		}
		for(int i = 0; i < N; i++){
			ZeroOnePack(F, packs[i][0], packs[i][1]);
		}
		return F[V];
	}
	
	private void ZeroOnePack(int[] F, int C, int W){
		for(int v = V; v >= C; v--)
			F[v] = max(F[v], F[v - C] + W);
	}
	
	private int max(int x, int y){
		return x > y ? x : y;
	}

}

 

分享到:
评论

相关推荐

    【ACM/NOI/CSP】背包问题基础算法C++代码汇总!!!

    01背包问题是背包问题中最基础的形式,每个物品都有一个重量和一个价值,目标是选取一部分物品放入容量有限的背包中,使得装入背包的物品总价值最大。01背包问题的关键在于构建一个动态规划状态转移方程,通常用`dp...

    背包九讲,各种背包问题的分析

    5. 二维费用背包问题:在传统背包问题基础上,增加了一个维度的费用,即每个物品有两项费用,增加了问题的复杂性。文章给出了针对此问题的特定算法。 6. 分组背包问题:将物品分成若干组,每组中只能选择一个物品...

    背包问题 Matlab 求解

    **0-1背包问题**是最基础的形式,每种物品只能取或不取,不能分割。在Matlab中求解0-1背包问题,通常采用动态规划(Dynamic Programming)方法。动态规划通过构建一个二维数组来存储子问题的解,从而避免重复计算,...

    背包问题九讲 2.0 RC1

    解决分组背包问题需要在传统的动态规划方法基础上,增加一步判断,以确保每组中最多只选了一件物品。 10. 有依赖的背包问题 有依赖的背包问题中,物品之间存在依赖关系,某些物品必须在另一些物品放入背包后才能放...

    背包 背包问题 背包算法

    通过学习和实践背包问题,不仅可以提升解决问题的能力,也为未来的计算机科学和工程研究打下坚实的基础。对于学生和爱好者而言,深入理解并熟练应用背包算法,无疑会增强他们在信息技术领域的竞争力。

    背包问题,算法的背包问题

    同时,背包问题也是许多复杂问题的基础,例如旅行商问题、作业调度问题等,可以通过转化成背包问题来求解。 通过深入理解背包问题及其动态规划解法,我们可以掌握一种重要的问题解决技巧,这对于解决实际问题和...

    背包问题,详细讲解几种背包问题

    ### 背包问题详解及变种解析 #### 一、引言 背包问题作为计算机科学与算法领域中的经典问题之一,在实际应用中具有广泛的意义。它不仅涉及到动态规划的核心思想,而且通过不同的变种形式,能够帮助我们深入理解...

    背包问题9讲

    1. 01背包问题:这是一种基础的背包问题,在这个问题中,对于每一件物品,你只有两种选择:要么选择这件物品装入背包,要么不装入。每种物品只能选择一次,这要求我们在决策时权衡每件物品的价值和重量,以达到背包...

    经典数据结构问题 背包问题所有解

    这里我们关注的是一个经典的数据结构问题——背包问题。背包问题是一类优化问题,常见于运筹学、计算机科学和算法设计中。在本案例中,我们将讨论如何用C语言和栈来解决这类问题。 首先,让我们了解背包问题的基本...

    贪心算法 背包问题 C语言

    0-1背包问题是最基础的形式,其中每个物品要么完全放入背包,要么完全不放。但在部分背包问题中,我们可以选择物品的一部分进行装入,这样增加了问题的复杂性和灵活性。部分背包问题通常用于模拟资源分配、项目选择...

    算法参考资料背包九讲算法参考资料背包九讲

    算法参考资料《背包九讲》是一本专注于讨论背包问题及其各种变种问题的算法参考书,作者通过九个章节,详细介绍了背包问题的基础知识、解题方法以及优化技巧,是学习和研究背包问题不可或缺的参考资料。 在算法中,...

    背包问题九讲

    本资源为一系列关于背包问题的讲解,共九讲,涵盖了大部分背包问题的理论基础。通过这九讲,读者可以系统地学习背包问题的基本概念、解决方法和优化技巧。 第一讲:基本背包问题 背包问题的基本形式是:给定 n 件...

    背包问题数据集

    背包问题,作为运筹学和计算机科学领域中的一个经典优化问题,已存在...通过不断收集和构建数据集,未来的研究人员可以进一步探索多维背包问题,持续提升算法的效率和鲁棒性,为解决更为复杂的优化问题奠定坚实基础。

    贪心算法 部分背包问题

    贪心算法是计算机科学中解决问题的一种策略,它通过做出局部最优选择来逐步达到全局最优解。在部分背包问题中,这种策略...同时,这也提供了一个基础,以便他们能够扩展到更复杂的问题,如完全背包问题或多重背包问题。

    背包问题Matlab求解

    标题中的“背包问题Matlab求解”指的是使用Matlab编程解决经典的组合优化问题——背包问题。背包问题是一个在有限的背包容量下,选择物品以最大化总价值的问题。它广泛应用于资源分配、项目选择等领域。 首先,我们...

    9大背包问题详解9大背包问题详解

    背包问题,作为算法世界中的一块瑰宝,一直吸引着无数算法爱好者和研究者的目光。它的魅力不仅仅在于其本身的趣味性和挑战性,更在于它与现实世界中许多问题的紧密联系。在算法的学习和应用中,我们经常会遇到这样的...

    01背包问题的C语言代码

    01背包问题是一种经典的计算机科学优化问题,常用于求解有限资源下的最佳分配策略。它在实际生活中的应用广泛,比如商品装箱、任务调度、投资组合优化等场景。在这个问题中,我们有一系列物品,每个物品都有一个价值...

    背包问题九讲(01背包,多重背包,完全背包等)

    01背包问题是最基础的背包问题类型,其名称来源于每个物品只能被取走0个或1个。给定一组物品,每个物品有自己的价值和重量,以及一个背包的最大容量,目标是求解在不超过背包容量的情况下,如何选择物品以使总价值...

    背包问题九讲2.0(13年修订版).pdf

    多重背包问题是在01背包问题和完全背包问题的基础上进一步扩展而成,允许每种物品有限次选取。通过转化为01背包问题或者直接设计算法,可以有效地解决这类问题。 #### 四、混合三种背包问题 **4.1 问题** 在实际...

Global site tag (gtag.js) - Google Analytics