带有零件集的背包递归解决方案
Posted
技术标签:
【中文标题】带有零件集的背包递归解决方案【英文标题】:Knapsack recursive solution with the part sets 【发布时间】:2015-05-06 10:24:05 【问题描述】:我有java中背包问题的递归解决方案,这是我的代码:
public class OptimalIncome
final static int length[] = new int[] 1, 2, 3, 4, 5, 6, 7, 8, 9, 10;
final static int price[] = new int[] 1, 5, 8, 9, 10, 17, 17, 20, 24, 30;
public static int totalLength = 9;
public static int bestCut(int i, int totalLength)
if(i < 0)
return 0;
else if(length[i] > totalLength)
return bestCut(i - 1, totalLength);
else
return Math.max(bestCut(i - 1, totalLength), bestCut(i - 1, totalLength - length[i]) + price[i]);
public static void main(String[] args)
System.out.println("Given total rod length : " + totalLength);
System.out.println("Maximum income : " + bestCut(price.length-1, totalLength));
System.out.println("Smaller part sets : ");
它工作得很好,你可以看到我想打印一组选择(较小的部分)。我怎样才能做到这一点? 谢谢
【问题讨论】:
as you can see I want to print the set of choices (smaller parts)
不知道你在这句话中的意思。什么是“选择集”?
您想打印实际拾取的对象,而不仅仅是 bestCut ?
是的,对不起,我没有很好地解释这个问题。我想看看程序为最佳剪辑选择了哪些项目
相关/欺骗,在 knspack 最优解中查找元素:How to find which elements are in the bag, using Knapsack Algorithm?,find items in knapsack bag。不想标记欺骗自己,因为我是这些问题的回答者,但这些线程确实处理了这个问题。 (一个解释如何在 DP 解决方案中做到这一点,另一个在递归解决方案中,这是你的情况)。
@amit 谢谢我看了他们,但他们使用矩阵,我的只是一个数组,我怎样才能为我的代码实现它? (对不起,我不太擅长复用其他代码)
【参考方案1】:
我们开始吧:
导入 java.util.ArrayList; 导入 java.util.List;
public class OptimalIncome
final static int length[] = new int[] 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ;
final static int price[] = new int[] 1, 5, 8, 9, 10, 17, 17, 20, 24, 30 ;
public static int totalLength = 9;
static List<Integer> pickedObjects = new ArrayList<Integer>();
public static int bestCut(int i, int totalLength)
if (i < 0)
return 0;
else if (length[i] > totalLength)
return bestCut(i - 1, totalLength);
else
return Math.max(bestCut(i - 1, totalLength),
bestCut(i - 1, totalLength - length[i]) + price[i]);
public static void printSolution(int i,int totalLength)
if(i < 0)
return;
else if(length[i]>totalLength)
printSolution(i-1, totalLength);
else
int sol1 = bestCut(i-1,totalLength);
int sol2 = bestCut(i - 1, totalLength - length[i]) + price[i];
// check whether the optimal solution coming from picking the object or not .
if(sol1>sol2)
printSolution(i-1, totalLength);
else
pickedObjects.add(i);
printSolution(i-1, totalLength - length[i]);
public static void main(String[] args)
System.out.println("Given total rod length : " + totalLength);
System.out.println("Maximum income : "
+ bestCut(price.length - 1, totalLength));
System.out.println("Smaller part sets : ");
printSolution(price.length-1, totalLength);
for (Integer i : pickedObjects)
System.out.println("picked object: "+ i +" length : "+ length[i]+ " price "+ price[i]);
我们只需要进行逆递归并检查您是否获得了构造输出的最佳解决方案。
虽然我认为您可能会在您的解决方案中添加一些记忆,以便它足够快。 希望对您有所帮助。
【讨论】:
以上是关于带有零件集的背包递归解决方案的主要内容,如果未能解决你的问题,请参考以下文章