如何从给定菜单中找到低于目标值的最大价格

时间:2014-10-04 01:40:18

标签: java recursion

我正在尝试创建一个名为selectFood的方法,它将我所拥有的金额作为参数输出,在屏幕上输出选择并返回我将离开的百分比小数舍入到一个小数位。

我有可能通过递归而没有提示的成本,但我需要比较它们并找到更大的。请帮忙

public static void selectFood(double money){
    /*String[]menu={"Bandera Pizza Bread","Boston's Pizza Bread","Garlic Twist Bread","Single Order",
                "Sun-Dried Tomato Bruschetta","Three Cheese Toast","Double Order wings","Starter Size wings",
                "Cactus Nachos","Baked Ravioli Bites","Southwest Quesadilla"};
    */
    double[]itemCost={6.49,5.35,7.49,5.35,6.99,6.35,16.49,8.99,10.29,8.49,9.25};

    possibilities(itemCost.length,"",itemCost,money);

    //selectFood(n,itemCost,0);
}

public static void possibilities(int length,String sofar,double[]itemCost,double money){

    if(length==0){
        //selectFood(sofar,itemCost,money,0);
        float totCost=0;

        double target=money/1.15;
        double minTip=money-target;

        char[]sofarList=sofar.toCharArray();
        for(int i=0;i<sofarList.length;i++){
            if(sofarList[i]=='1'){
                totCost+=itemCost[i];
            }

        }
        if(totCost<target){
        System.out.println(totCost);
        }

    }
    else{
        possibilities(length-1,sofar+"0",itemCost,money);
        possibilities(length-1,sofar+"1",itemCost,money);
    }
}

现在我回来了

0.0

8.49 6.35 6.99 5.35 7.49 5.35 6.49

2 个答案:

答案 0 :(得分:0)

你的方法可能遇到的问题(除了它相对难以理解)之外,你的方法实际上并没有计算一个值(好吧......至少没有返回任何值),但它正在打印一些东西给{ {1}}。通常,您的方法应 计算更改状态(例如,执行I / O),但不能同时计算两者。

一个简单的解决方法是将System.out存储在实例变量中而不是打印它。也就是说,你可以改变你的行:

totCost

if(totCost < target){
    System.out.println(totCost);
}

其中if(totCost < target && highestPrice < totCost){ highestPrice = totCost; } 是实例变量。现在,您可以从highestPrice方法访问highestPrice

请注意,这是一个黑客rathar而不是一个干净的解决方案!如果您的selectFood方法将返回其计算的值作为常规返回值,那么您的代码将更加清晰。

重新思考如何递归计算成本:

  • 您将获得一组(在您的情况下,数组)价格和预算。

  • 对于每个价格,您可以采取该项目并支付价格,或者您不能采取该项目并保留金钱

  • 如果列表中只有一个项目,那么您可以制作的最昂贵的组合是possibilities,如果您负担不起该项目,或者项目的价值,如果可以的话。

最后一点是你的基础案例(不考虑你也可以有一个空数组)。所以你有一个基本案例

0

此处注意:不要在您的代码中添加幻数(例如,1.15)。它们没有任何意义。

现在针对double possibilities(double[] items, double money){ if (items.length == 1 && items[0] < money / 1.15) return items[0]; else return 0; 的一般情况:我们可以采取第一项,或者我们不能采取它。如果我们确实接受了,那么我们将花更少的钱用于剩下的物品。此外,如果我们能负担得起,我们只能接受它,即items.length>1。剩余的钱和其余的项目我们称之为递归方法,并采取更大的价值。

money>items[0]

很抱歉这里的代码太乱了。因为您正在使用数组,所以需要将项目1复制到新数组中的长度,以便在递归调用中传递它。另外......我不太清楚1.15的划分应该做什么,所以你可能需要调整你递归传递的钱。

答案 1 :(得分:0)

要找到目标值以下的最大值,您需要一个变量来保存您通过递归进行的每次迭代中的当前最大值。

我更改了程序的逻辑以跟踪当前的最大值

public static void possibilities(int length,String sofar,double[]itemCost,double money){
    if(length==0){
        //selectFood(sofar,itemCost,money,0);
        float totCost=0;

        double target=money/1.15;
        double minTip=money-target;

        char[]sofarList=sofar.toCharArray();
        for(int i=0;i<sofarList.length;i++){
            if(sofarList[i]=='1'){
                totCost+=itemCost[i];
            }

        }
        if(totCost<target && totCost>max){
            max = totCost;
            System.out.println(totCost);
            for(int i=0;i<sofarList.length;i++){
                System.out.print(sofarList[i]);
            }   
            System.out.println("\n");
        }

    }
    else{
        possibilities(length-1,sofar+"0",itemCost,money);
        possibilities(length-1,sofar+"1",itemCost,money);
    }
}

你需要在类中声明变量max as static

static double max=0;

我添加了print语句以显示在每个可行迭代中选择的最大值。

在所有迭代结束后,最大值存储在max变量中,并跟踪菜单列表,我们需要再添加一个静态变量,如下所示

static String menulist=null;

我们需要在方法可能性

中分配值
if(totCost<target && totCost>max){
            max = totCost;
            menulist = sofarList;
}