背包问题有许多种形式,最简单的背包问题形式:现在有一堆石头,(比如重量为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();
}
}
分享到:
相关推荐
基于于C++的使用递归的方式解0-1背包
动态规划是一种在计算机科学中广泛使用的算法设计方法,特别是在解决最优化问题时,如背包问题。这个压缩包文件“算法-动态规划- 背包问题 P09- 背包问题的变化(包含源程序).rar”显然是关于动态规划在背包问题中...
递归是解决0-1背包问题的一种常见方法。其基本思想是从最小规模的子问题开始,逐步构建到原问题的解决方案。对于第i个物品和容量为j的情况,我们可以有两种选择:要么选择该物品,要么不选择。如果选择,那么背包的...
### 0-1 背包问题:递归算法 C语言实现 #### 一、问题背景及定义 0-1背包问题是一种经典的组合优化问题,在计算机科学与运筹学领域有着广泛的应用。该问题的基本形式如下:给定一组物品,每种物品都有自己的重量和...
利用回溯法解0-1背包问题是子集选取问题,0-1背包问题是NP难题,回溯法可以很好地解决背包问题,以期得到最优解。 回溯法概念: * 回溯法是一个既带有系统性又带有跳跃性的搜索算法。 * 它在包含问题的所有解的解...
回溯递归解决背包问题 int temp_c,i,total_weight,num,j=0,result[1000],total_value; scanf("%d%d",#,&temp;_c); while(num!=0||temp_c!=0) { total_value=0; total_weight=0; for(i=0;i;++i) { a[i]...
在0-1背包问题中,我们可以定义一个递归函数,该函数根据物品的重量、价值和背包剩余容量来决定是否选取该物品。递归公式可以表示为:`maxValue(i, W) = max( maxValue(i-1, W), maxValue(i-1, W-w[i]) + v[i] )`,...
**背包问题递归算法在C语言中的实现** 背包问题是一个经典的计算机科学问题,它涉及到在给定容量限制的背包中,如何选择物品以达到最大的价值。这个问题通常被用来模拟资源有限的情况下的决策优化,比如投资组合...
### 0-1背包问题分支界限法求解——C语言实现 #### 一、背景介绍 在计算机科学中,背包问题是一类优化问题的经典案例,它涉及到如何在满足一定约束条件下(例如背包的最大承重),从一系列物品中选择最优组合以达到...
0-1背包问题是一种经典的组合优化问题,在计算机科学和运筹学中有着广泛的应用。它描述的是这样的场景:你有一个背包,其容量有限,而有一系列物品,每个物品都有自己的重量和价值。你的目标是在不超过背包容量的...
- `knapsackProblemDP.cpp`:这应该是使用存储优化的递归方法实现的0/1背包问题。 - `knapsackProblemBottomUpDP.cpp`:这个文件实现了自下而上的递归(迭代法),从基本情况开始逐步计算`dp`数组。 - `...
在计算机科学中,0-1背包问题是一个经典的动态规划实例,它模拟了如何在一个容量有限的背包中选择物品以最大化价值,而每个物品都有其特定的重量和价值,并且物品要么不被选中(0),要么被完全放入背包(1)。...
对于含\[n\]个物品的0-1背包问题,最深的递归层数为\[n\],因此空间复杂度为\[O(n)\]。 ##### 2. 动态规划法求解0-1背包问题 **基本思想** 动态规划法通过将大问题分解为小问题,并存储已经解决的小问题的答案来...
回溯法实现0-1背包问题 在计算机科学中,0-1背包问题是一个经典的组合优化问题。给定一组项目,每个项目都有一个价值和重量,目标是选择一些项目,使得总价值最大化,总重量不超过背包的容量限制。回溯法是一种常...
然后,使用一个循环结构,通过递归地添加或移除物品,尝试找到使背包价值最大化的组合。最终返回的是背包的最大价值。 #### 四、主函数解析 在主函数中,设置了问题的参数,包括物品的数量`n`、背包的容量`M`以及...
### C++ 0-1 背包问题详解与源代码解析 #### 一、问题背景及定义 在计算机科学中,0-1背包问题是一个经典的优化问题,属于NP完全问题。该问题描述如下:假设有一个背包,其最大承重为W,现在有n个物品,每个物品都...
在C#中,可以使用递归函数实现背包问题的求解。基本的递归函数原型可以表示为: ```csharp void Knapsack(int i, int weight, int tv, int[] weights, int[] values, int W) { // 省略具体实现 } ``` 函数参数...
自己写的用递归实现的背包问题,欢迎各位高手指正。
分别用回溯法和分支限界法求解0-1背包问题 本实验报告的主要内容是使用回溯法和分支限界法解决0-1背包问题。0-1背包问题是指给定n种物品和一个背包,物品i的重量是Wi,其价值为Vi,背包的容量为C。应如何选择装入...
1. **递归解法**:0-1背包问题的递归公式可以表示为: - 如果没有物品或者背包容量为0,那么最大价值为0。 - 否则,我们有两种选择:要么不选第`i`件物品(`dp[i][w] = dp[i-1][w]`),要么选择第`i`件物品(如果...