带有零件集的背包递归解决方案

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]);
        
    

我们只需要进行逆递归并检查您是否获得了构造输出的最佳解决方案。

虽然我认为您可能会在您的解决方案中添加一些记忆,以便它足够快。 希望对您有所帮助。

【讨论】:

以上是关于带有零件集的背包递归解决方案的主要内容,如果未能解决你的问题,请参考以下文章

Java中背包的递归解决方案

我的背包递归解决方案可以改进吗?

在C中递归解决背包问题的麻烦

背包问题变体的递归关系?

c++ - 如何在递归中使用记忆来解决0-1背包问题而没有运行时错误以在c ++中进行较大的输入?

01背包问题