`
shenyu
  • 浏览: 122979 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

递归-背包问题

阅读更多

背包问题有许多种形式,最简单的背包问题形式:现在有一堆石头,(比如重量为2,6,8,10),一个背包中可以装指定的重量(比如14)的石头,请问背包中可以放入的石头的组合。

代码中假设石头是个源数组,背包是目标数组。

算法中使用分治的想法将此问题递归为两个小范围的问题。

针对第n个石头,背包问题可以分解为两种组合的何:含第n个石头的背包的组合,与不含n个石头的背包的组合,

1.假设含第n个石头,背包问题变为,针对剩下的石头求得总重量减去第n个石头的重量的背包问题。

2.不含n个石头,背包问题变为针对剩下的石头求得总重量的背包问题。

class Bag {
	public static void main(String[] args) {
		int[] src = {2,4,5,7,8,6,10};
		select(14,src, 0, new int[src.length]);
	}
	
	/**
	 * @param total 总数
	 * @param src 源数据数组
	 * @param offset 源数组的起始位置
	 * @param bag 背包,装选中的数据
	 */
	private static void select(int total, int [] src, int offset, int[] bag) {
		if(total == 0) {	//背包要求增加的重量为0,则直接打印背包
			print(bag);
			return;
		}
		//从起始值开始寻找第一个小于要求增加重量的数值
		while(offset < src.length && total < src[offset]) offset++;
		if(offset >= src.length) return;	//当没有源数据可以选择,则退出
		//将问题化简为在剩下的源数据中,两个找到重量的问题
		select(total,src,offset+1,bag.clone());	//背包中含有offset位置的
		select(total-src[offset],src,offset+1,put(bag,src[offset]));//背包中不含有offset位置的
	}
	
	private static int[] put(int[] bag, int n) { //将数字放入背包中
		int pos = -1;
		while(bag[++pos] > 0);	//找到背包中第一个数字为0的位置
		bag[pos] = n;
		return bag;
	}

	private static void print(int[] bag) {	//打印背包中的数字
		System.out.print("bag: ");
		for(int n: bag) {
			if(n == 0) break;
			System.out.print(n + " ");
		}
		System.out.println();
	}
}

 

4
2
分享到:
评论

相关推荐

    递归解0-1背包问题

    基于于C++的使用递归的方式解0-1背包

    算法-动态规划- 背包问题 P09- 背包问题的变化(包含源程序).rar

    动态规划是一种在计算机科学中广泛使用的算法设计方法,特别是在解决最优化问题时,如背包问题。这个压缩包文件“算法-动态规划- 背包问题 P09- 背包问题的变化(包含源程序).rar”显然是关于动态规划在背包问题中...

    0-1背包递归求解Java语言描述

    递归是解决0-1背包问题的一种常见方法。其基本思想是从最小规模的子问题开始,逐步构建到原问题的解决方案。对于第i个物品和容量为j的情况,我们可以有两种选择:要么选择该物品,要么不选择。如果选择,那么背包的...

    0-1背包问题-递归算法 c语言实现

    ### 0-1 背包问题:递归算法 C语言实现 #### 一、问题背景及定义 0-1背包问题是一种经典的组合优化问题,在计算机科学与运筹学领域有着广泛的应用。该问题的基本形式如下:给定一组物品,每种物品都有自己的重量和...

    利用回溯法解0-1背包问题讲解

    利用回溯法解0-1背包问题是子集选取问题,0-1背包问题是NP难题,回溯法可以很好地解决背包问题,以期得到最优解。 回溯法概念: * 回溯法是一个既带有系统性又带有跳跃性的搜索算法。 * 它在包含问题的所有解的解...

    回溯递归解决背包问题

    回溯递归解决背包问题 int temp_c,i,total_weight,num,j=0,result[1000],total_value; scanf("%d%d",&num;,&temp;_c); while(num!=0||temp_c!=0) { total_value=0; total_weight=0; for(i=0;i;++i) { a[i]...

    0-1背包问题分支界限法求解-C语言实现

    ### 0-1背包问题分支界限法求解——C语言实现 #### 一、背景介绍 在计算机科学中,背包问题是一类优化问题的经典案例,它涉及到如何在满足一定约束条件下(例如背包的最大承重),从一系列物品中选择最优组合以达到...

    山东科技大学算法设计与分析实验7:0-1背包问题的回溯和递归算法 源.cpp+报告

    在0-1背包问题中,我们可以定义一个递归函数,该函数根据物品的重量、价值和背包剩余容量来决定是否选取该物品。递归公式可以表示为:`maxValue(i, W) = max( maxValue(i-1, W), maxValue(i-1, W-w[i]) + v[i] )`,...

    背包问题递归算法C语言

    **背包问题递归算法在C语言中的实现** 背包问题是一个经典的计算机科学问题,它涉及到在给定容量限制的背包中,如何选择物品以达到最大的价值。这个问题通常被用来模拟资源有限的情况下的决策优化,比如投资组合...

    0-1背包问题(回溯算法)

    0-1背包问题是一种经典的组合优化问题,在计算机科学和运筹学中有着广泛的应用。它描述的是这样的场景:你有一个背包,其容量有限,而有一系列物品,每个物品都有自己的重量和价值。你的目标是在不超过背包容量的...

    0/1背包问题的两种解法--存储优化的递归和自下而上的递归(迭代法)

    - `knapsackProblemDP.cpp`:这应该是使用存储优化的递归方法实现的0/1背包问题。 - `knapsackProblemBottomUpDP.cpp`:这个文件实现了自下而上的递归(迭代法),从基本情况开始逐步计算`dp`数组。 - `...

    C++ 动态规划算法实现0-1背包问题

    在计算机科学中,0-1背包问题是一个经典的动态规划实例,它模拟了如何在一个容量有限的背包中选择物品以最大化价值,而每个物品都有其特定的重量和价值,并且物品要么不被选中(0),要么被完全放入背包(1)。...

    动态规划法和回溯法求0-1背包问题

    对于含\[n\]个物品的0-1背包问题,最深的递归层数为\[n\],因此空间复杂度为\[O(n)\]。 ##### 2. 动态规划法求解0-1背包问题 **基本思想** 动态规划法通过将大问题分解为小问题,并存储已经解决的小问题的答案来...

    遗传算法回溯算法解0--1背包问题

    然后,使用一个循环结构,通过递归地添加或移除物品,尝试找到使背包价值最大化的组合。最终返回的是背包的最大价值。 #### 四、主函数解析 在主函数中,设置了问题的参数,包括物品的数量`n`、背包的容量`M`以及...

    C++ 0-1背包问题源代码

    ### C++ 0-1 背包问题详解与源代码解析 #### 一、问题背景及定义 在计算机科学中,0-1背包问题是一个经典的优化问题,属于NP完全问题。该问题描述如下:假设有一个背包,其最大承重为W,现在有n个物品,每个物品都...

    分别用回溯法和分支限界法求解0-1背包问题

    分别用回溯法和分支限界法求解0-1背包问题 本实验报告的主要内容是使用回溯法和分支限界法解决0-1背包问题。0-1背包问题是指给定n种物品和一个背包,物品i的重量是Wi,其价值为Vi,背包的容量为C。应如何选择装入...

    Visual C# 课程设计说明书------背包问题

    在C#中,可以使用递归函数实现背包问题的求解。基本的递归函数原型可以表示为: ```csharp void Knapsack(int i, int weight, int tv, int[] weights, int[] values, int W) { // 省略具体实现 } ``` 函数参数...

    背包问题的递归实现代码

    自己写的用递归实现的背包问题,欢迎各位高手指正。

    bag_0-1背包问题递归非递归动态规划_

    1. **递归解法**:0-1背包问题的递归公式可以表示为: - 如果没有物品或者背包容量为0,那么最大价值为0。 - 否则,我们有两种选择:要么不选第`i`件物品(`dp[i][w] = dp[i-1][w]`),要么选择第`i`件物品(如果...

    vc0-1背包问题递归和动态规划的c语言代码

    ### 0-1背包问题的C语言实现:递归与动态规划 #### 一、问题背景及概述 0-1背包问题是计算机科学中一个经典的组合优化问题,它涉及到如何从一组物品中选择部分物品装入背包,使得背包的总价值最大,同时不超过背包...

Global site tag (gtag.js) - Google Analytics