我正在尝试创建一个名为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
答案 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;
}