本人其实内心很抵触去埋头刷算法题,但是有一些算法在实际业务开发中或者思想上还是值得借鉴的,因此通过这种结合实际场景的小Demo来学习和理解算法也可能是对算法提起兴趣对抗枯燥的一种方法吧。
在看《剑指Offer》的时候看到回溯章节时,书中的举一反三提到了回溯算法可以应用到像点菜这样的场景中。例如,当客人走进餐馆准备吃饭时,服务员会为客人提供一个菜单,菜单上有所有菜品的价格。如果每道菜只点一份,那么可人有哪些不同的点菜方法刚好将身上的钱全部用完?如果客人只想点k道菜,那么又有哪些不同的点菜方法可以将身上的钱全部用完?如果一道菜可以点多份呢?
结合上面多场景我们可以写一个程序来模拟它,由于现实中不可能所有客人身上的钱都刚好能点所有的菜,所以我把上面场景中的刚好花完客人身上的钱改为在客人钱的范围内能点多所有菜的集合,并且我只实现前面两种策略,即不花光身上的钱的情况下最多只点一道菜可以有多少总策略和不花光身上的钱的情况下指定点菜的数量,并且没到菜也是最多能点一次,至于后面的一道菜可以点多次实现类似,但意义不大,就不写了(毕竟平时出去吃饭点菜大部分不会盯着一个菜点好几份)。下面是代码实现。
视频演示
使用回溯算法解决点菜问题的小Demo演示
代码实现
为了完整的模拟,我们抽象出客人类和菜单类。
客人类
package test;
/**
* 顾客类
* @author 胡海龙<www.huhailong.vip>
*
*/
public class Customer {
/**
* 用户名
*/
private String username;
/**
* 身上总金额 (暂时为了测试将该类型设置为整型,实际应用中应该使用高精度来修饰)
*/
private Integer amount;
//Getter and Setter
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Integer getAmount() {
return amount;
}
public void setAmount(Integer amount) {
this.amount = amount;
}
}
菜单类
package test;
/**
* 菜单类
* @author 胡海龙<www.huhailong.vip>
*
*/
public class FoodMenu {
/**
* 菜名
*/
private String foodName;
/**
* 价格
*/
private Integer price;
//Getter and Setter
public String getFoodName() {
return foodName;
}
public void setFoodName(String foodName) {
this.foodName = foodName;
}
public Integer getPrice() {
return price;
}
public void setPrice(Integer price) {
this.price = price;
}
}
消费点单类(模拟点单)
package test;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
/**
* 结账业务类
* @author 胡海龙<www.huhailong.vip>
*
*/
public class CheckOut {
/**
* 测试主方法
* @param args
*/
public static void main(String[] args) {
//初始化测试用户
Customer customer = new Customer();
customer.setUsername("胡海龙");
customer.setAmount(300);
//使用一个临时的map数据集模拟数据库菜单表
Map<String,Integer> foodMenuMap = new HashMap<>();
foodMenuMap.put("米饭", 4);
foodMenuMap.put("鱼香肉丝", 48);
foodMenuMap.put("糖醋排骨", 68);
foodMenuMap.put("京酱肉丝", 48);
foodMenuMap.put("地锅鸡", 78);
foodMenuMap.put("蚂蚁上树", 178);
foodMenuMap.put("毛氏红烧肉", 79);
foodMenuMap.put("蒜末拍黄瓜", 12);
//初始化菜单列表
List<FoodMenu> foodMenuList = new LinkedList<>();
for(String key : foodMenuMap.keySet()) {
FoodMenu menu = new FoodMenu();
menu.setFoodName(key);
menu.setPrice(foodMenuMap.get(key));
foodMenuList.add(menu);
}
//定义结果集
List<List<FoodMenu>> result = new LinkedList<>();
makePolicy1(foodMenuList, 0, customer.getAmount(), new LinkedList<>(), result);
// makePolicy2(foodMenuList, 0, customer.getAmount(), 2, new LinkedList<>(), result);
//打印策略
printPolicy(result);
}
/**
* 策略1 每道菜最多只点一次,在不花光身上所有钱的情况下有哪些点菜的策略
* @param foodMenuList 菜单集合
* @param index 菜单索引
* @param total 顾客身上总钱数
* @param tempList 临时存储集合
* @param result 策略结果集合
*/
private static void makePolicy1(List<FoodMenu> foodMenuList, int index, int total, LinkedList<FoodMenu> tempList, List<List<FoodMenu>> result) {
int sum = tempList.stream().mapToInt(FoodMenu::getPrice).sum();
if(index==foodMenuList.size()&&sum<=total) {
result.add(new LinkedList<>(tempList));
}else if(index < foodMenuList.size()) {
makePolicy1(foodMenuList, index+1, total, tempList, result);
tempList.add(foodMenuList.get(index));
makePolicy1(foodMenuList, index+1, total, tempList, result);
tempList.removeLast();
}
}
/**
* 策略2 每道菜最多只点一次,并且顾客指定点k道菜,在不花光身上所有钱的情况下有哪些点菜的策略
* @param foodMenuList 菜单集合
* @param index 菜单索引
* @param total 顾客身上总钱数
* @param k 指定菜的数量
* @param tempList 临时存储集合
* @param result 策略结果集合
*/
private static void makePolicy2(List<FoodMenu> foodMenuList, int index, int total, int k, LinkedList<FoodMenu> tempList, List<List<FoodMenu>> result) {
int sum = tempList.stream().mapToInt(FoodMenu::getPrice).sum();
if(index==foodMenuList.size()&&sum<=total&&k==tempList.size()) {
result.add(new LinkedList<>(tempList));
}else if(index < foodMenuList.size()) {
makePolicy2(foodMenuList, index+1, total, k, tempList, result);
tempList.add(foodMenuList.get(index));
makePolicy2(foodMenuList, index+1, total, k, tempList, result);
tempList.removeLast();
}
}
/**
* 打印策略结果
*/
private static void printPolicy(List<List<FoodMenu>> list) {
int count = 1;
for(List<FoodMenu> foodMenuList : list) {
System.out.print("策略"+(count++)+":");
int totalPrice = 0;
for(FoodMenu menu : foodMenuList) {
totalPrice += menu.getPrice();
System.out.print(menu.getFoodName()+"("+menu.getPrice()+") ");
}
System.out.print(" 【总价:】"+totalPrice);
System.out.println();
}
}
}
策略一运行结果
该策略是指用户每道菜最多只能点一次,在总金额不超过用户身上带的总钱数(该demo中设置的是300元)时点所有点菜策略,策略1为0表明客户没有进行消费。菜名后面括号中的是菜名的单价,后面会现实没种策略的总价。运行结果符合上述要求。
策略1: 【总价:】0
策略2:京酱肉丝(48) 【总价:】48
策略3:毛氏红烧肉(79) 【总价:】79
策略4:毛氏红烧肉(79) 京酱肉丝(48) 【总价:】127
策略5:蒜末拍黄瓜(12) 【总价:】12
策略6:蒜末拍黄瓜(12) 京酱肉丝(48) 【总价:】60
策略7:蒜末拍黄瓜(12) 毛氏红烧肉(79) 【总价:】91
策略8:蒜末拍黄瓜(12) 毛氏红烧肉(79) 京酱肉丝(48) 【总价:】139
策略9:地锅鸡(78) 【总价:】78
策略10:地锅鸡(78) 京酱肉丝(48) 【总价:】126
策略11:地锅鸡(78) 毛氏红烧肉(79) 【总价:】157
策略12:地锅鸡(78) 毛氏红烧肉(79) 京酱肉丝(48) 【总价:】205
策略13:地锅鸡(78) 蒜末拍黄瓜(12) 【总价:】90
策略14:地锅鸡(78) 蒜末拍黄瓜(12) 京酱肉丝(48) 【总价:】138
策略15:地锅鸡(78) 蒜末拍黄瓜(12) 毛氏红烧肉(79) 【总价:】169
策略16:地锅鸡(78) 蒜末拍黄瓜(12) 毛氏红烧肉(79) 京酱肉丝(48) 【总价:】217
策略17:糖醋排骨(68) 【总价:】68
策略18:糖醋排骨(68) 京酱肉丝(48) 【总价:】116
策略19:糖醋排骨(68) 毛氏红烧肉(79) 【总价:】147
策略20:糖醋排骨(68) 毛氏红烧肉(79) 京酱肉丝(48) 【总价:】195
策略21:糖醋排骨(68) 蒜末拍黄瓜(12) 【总价:】80
策略22:糖醋排骨(68) 蒜末拍黄瓜(12) 京酱肉丝(48) 【总价:】128
策略23:糖醋排骨(68) 蒜末拍黄瓜(12) 毛氏红烧肉(79) 【总价:】159
策略24:糖醋排骨(68) 蒜末拍黄瓜(12) 毛氏红烧肉(79) 京酱肉丝(48) 【总价:】207
策略25:糖醋排骨(68) 地锅鸡(78) 【总价:】146
策略26:糖醋排骨(68) 地锅鸡(78) 京酱肉丝(48) 【总价:】194
策略27:糖醋排骨(68) 地锅鸡(78) 毛氏红烧肉(79) 【总价:】225
策略28:糖醋排骨(68) 地锅鸡(78) 毛氏红烧肉(79) 京酱肉丝(48) 【总价:】273
策略29:糖醋排骨(68) 地锅鸡(78) 蒜末拍黄瓜(12) 【总价:】158
策略30:糖醋排骨(68) 地锅鸡(78) 蒜末拍黄瓜(12) 京酱肉丝(48) 【总价:】206
策略31:糖醋排骨(68) 地锅鸡(78) 蒜末拍黄瓜(12) 毛氏红烧肉(79) 【总价:】237
策略32:糖醋排骨(68) 地锅鸡(78) 蒜末拍黄瓜(12) 毛氏红烧肉(79) 京酱肉丝(48) 【总价:】285
策略33:米饭(4) 【总价:】4
策略34:米饭(4) 京酱肉丝(48) 【总价:】52
策略35:米饭(4) 毛氏红烧肉(79) 【总价:】83
策略36:米饭(4) 毛氏红烧肉(79) 京酱肉丝(48) 【总价:】131
策略37:米饭(4) 蒜末拍黄瓜(12) 【总价:】16
策略38:米饭(4) 蒜末拍黄瓜(12) 京酱肉丝(48) 【总价:】64
策略39:米饭(4) 蒜末拍黄瓜(12) 毛氏红烧肉(79) 【总价:】95
策略40:米饭(4) 蒜末拍黄瓜(12) 毛氏红烧肉(79) 京酱肉丝(48) 【总价:】143
策略41:米饭(4) 地锅鸡(78) 【总价:】82
策略42:米饭(4) 地锅鸡(78) 京酱肉丝(48) 【总价:】130
策略43:米饭(4) 地锅鸡(78) 毛氏红烧肉(79) 【总价:】161
策略44:米饭(4) 地锅鸡(78) 毛氏红烧肉(79) 京酱肉丝(48) 【总价:】209
策略45:米饭(4) 地锅鸡(78) 蒜末拍黄瓜(12) 【总价:】94
策略46:米饭(4) 地锅鸡(78) 蒜末拍黄瓜(12) 京酱肉丝(48) 【总价:】142
策略47:米饭(4) 地锅鸡(78) 蒜末拍黄瓜(12) 毛氏红烧肉(79) 【总价:】173
策略48:米饭(4) 地锅鸡(78) 蒜末拍黄瓜(12) 毛氏红烧肉(79) 京酱肉丝(48) 【总价:】221
策略49:米饭(4) 糖醋排骨(68) 【总价:】72
策略50:米饭(4) 糖醋排骨(68) 京酱肉丝(48) 【总价:】120
策略51:米饭(4) 糖醋排骨(68) 毛氏红烧肉(79) 【总价:】151
策略52:米饭(4) 糖醋排骨(68) 毛氏红烧肉(79) 京酱肉丝(48) 【总价:】199
策略53:米饭(4) 糖醋排骨(68) 蒜末拍黄瓜(12) 【总价:】84
策略54:米饭(4) 糖醋排骨(68) 蒜末拍黄瓜(12) 京酱肉丝(48) 【总价:】132
策略55:米饭(4) 糖醋排骨(68) 蒜末拍黄瓜(12) 毛氏红烧肉(79) 【总价:】163
策略56:米饭(4) 糖醋排骨(68) 蒜末拍黄瓜(12) 毛氏红烧肉(79) 京酱肉丝(48) 【总价:】211
策略57:米饭(4) 糖醋排骨(68) 地锅鸡(78) 【总价:】150
策略58:米饭(4) 糖醋排骨(68) 地锅鸡(78) 京酱肉丝(48) 【总价:】198
策略59:米饭(4) 糖醋排骨(68) 地锅鸡(78) 毛氏红烧肉(79) 【总价:】229
策略60:米饭(4) 糖醋排骨(68) 地锅鸡(78) 毛氏红烧肉(79) 京酱肉丝(48) 【总价:】277
策略61:米饭(4) 糖醋排骨(68) 地锅鸡(78) 蒜末拍黄瓜(12) 【总价:】162
策略62:米饭(4) 糖醋排骨(68) 地锅鸡(78) 蒜末拍黄瓜(12) 京酱肉丝(48) 【总价:】210
策略63:米饭(4) 糖醋排骨(68) 地锅鸡(78) 蒜末拍黄瓜(12) 毛氏红烧肉(79) 【总价:】241
策略64:米饭(4) 糖醋排骨(68) 地锅鸡(78) 蒜末拍黄瓜(12) 毛氏红烧肉(79) 京酱肉丝(48) 【总价:】289
策略65:鱼香肉丝(48) 【总价:】48
策略66:鱼香肉丝(48) 京酱肉丝(48) 【总价:】96
策略67:鱼香肉丝(48) 毛氏红烧肉(79) 【总价:】127
策略68:鱼香肉丝(48) 毛氏红烧肉(79) 京酱肉丝(48) 【总价:】175
策略69:鱼香肉丝(48) 蒜末拍黄瓜(12) 【总价:】60
策略70:鱼香肉丝(48) 蒜末拍黄瓜(12) 京酱肉丝(48) 【总价:】108
策略71:鱼香肉丝(48) 蒜末拍黄瓜(12) 毛氏红烧肉(79) 【总价:】139
策略72:鱼香肉丝(48) 蒜末拍黄瓜(12) 毛氏红烧肉(79) 京酱肉丝(48) 【总价:】187
策略73:鱼香肉丝(48) 地锅鸡(78) 【总价:】126
策略74:鱼香肉丝(48) 地锅鸡(78) 京酱肉丝(48) 【总价:】174
策略75:鱼香肉丝(48) 地锅鸡(78) 毛氏红烧肉(79) 【总价:】205
策略76:鱼香肉丝(48) 地锅鸡(78) 毛氏红烧肉(79) 京酱肉丝(48) 【总价:】253
策略77:鱼香肉丝(48) 地锅鸡(78) 蒜末拍黄瓜(12) 【总价:】138
策略78:鱼香肉丝(48) 地锅鸡(78) 蒜末拍黄瓜(12) 京酱肉丝(48) 【总价:】186
策略79:鱼香肉丝(48) 地锅鸡(78) 蒜末拍黄瓜(12) 毛氏红烧肉(79) 【总价:】217
策略80:鱼香肉丝(48) 地锅鸡(78) 蒜末拍黄瓜(12) 毛氏红烧肉(79) 京酱肉丝(48) 【总价:】265
策略81:鱼香肉丝(48) 糖醋排骨(68) 【总价:】116
策略82:鱼香肉丝(48) 糖醋排骨(68) 京酱肉丝(48) 【总价:】164
策略83:鱼香肉丝(48) 糖醋排骨(68) 毛氏红烧肉(79) 【总价:】195
策略84:鱼香肉丝(48) 糖醋排骨(68) 毛氏红烧肉(79) 京酱肉丝(48) 【总价:】243
策略85:鱼香肉丝(48) 糖醋排骨(68) 蒜末拍黄瓜(12) 【总价:】128
策略86:鱼香肉丝(48) 糖醋排骨(68) 蒜末拍黄瓜(12) 京酱肉丝(48) 【总价:】176
策略87:鱼香肉丝(48) 糖醋排骨(68) 蒜末拍黄瓜(12) 毛氏红烧肉(79) 【总价:】207
策略88:鱼香肉丝(48) 糖醋排骨(68) 蒜末拍黄瓜(12) 毛氏红烧肉(79) 京酱肉丝(48) 【总价:】255
策略89:鱼香肉丝(48) 糖醋排骨(68) 地锅鸡(78) 【总价:】194
策略90:鱼香肉丝(48) 糖醋排骨(68) 地锅鸡(78) 京酱肉丝(48) 【总价:】242
策略91:鱼香肉丝(48) 糖醋排骨(68) 地锅鸡(78) 毛氏红烧肉(79) 【总价:】273
策略92:鱼香肉丝(48) 糖醋排骨(68) 地锅鸡(78) 蒜末拍黄瓜(12) 【总价:】206
策略93:鱼香肉丝(48) 糖醋排骨(68) 地锅鸡(78) 蒜末拍黄瓜(12) 京酱肉丝(48) 【总价:】254
策略94:鱼香肉丝(48) 糖醋排骨(68) 地锅鸡(78) 蒜末拍黄瓜(12) 毛氏红烧肉(79) 【总价:】285
策略95:鱼香肉丝(48) 米饭(4) 【总价:】52
策略96:鱼香肉丝(48) 米饭(4) 京酱肉丝(48) 【总价:】100
策略97:鱼香肉丝(48) 米饭(4) 毛氏红烧肉(79) 【总价:】131
策略98:鱼香肉丝(48) 米饭(4) 毛氏红烧肉(79) 京酱肉丝(48) 【总价:】179
策略99:鱼香肉丝(48) 米饭(4) 蒜末拍黄瓜(12) 【总价:】64
策略100:鱼香肉丝(48) 米饭(4) 蒜末拍黄瓜(12) 京酱肉丝(48) 【总价:】112
策略101:鱼香肉丝(48) 米饭(4) 蒜末拍黄瓜(12) 毛氏红烧肉(79) 【总价:】143
策略102:鱼香肉丝(48) 米饭(4) 蒜末拍黄瓜(12) 毛氏红烧肉(79) 京酱肉丝(48) 【总价:】191
策略103:鱼香肉丝(48) 米饭(4) 地锅鸡(78) 【总价:】130
策略104:鱼香肉丝(48) 米饭(4) 地锅鸡(78) 京酱肉丝(48) 【总价:】178
策略105:鱼香肉丝(48) 米饭(4) 地锅鸡(78) 毛氏红烧肉(79) 【总价:】209
策略106:鱼香肉丝(48) 米饭(4) 地锅鸡(78) 毛氏红烧肉(79) 京酱肉丝(48) 【总价:】257
策略107:鱼香肉丝(48) 米饭(4) 地锅鸡(78) 蒜末拍黄瓜(12) 【总价:】142
策略108:鱼香肉丝(48) 米饭(4) 地锅鸡(78) 蒜末拍黄瓜(12) 京酱肉丝(48) 【总价:】190
策略109:鱼香肉丝(48) 米饭(4) 地锅鸡(78) 蒜末拍黄瓜(12) 毛氏红烧肉(79) 【总价:】221
策略110:鱼香肉丝(48) 米饭(4) 地锅鸡(78) 蒜末拍黄瓜(12) 毛氏红烧肉(79) 京酱肉丝(48) 【总价:】269
策略111:鱼香肉丝(48) 米饭(4) 糖醋排骨(68) 【总价:】120
策略112:鱼香肉丝(48) 米饭(4) 糖醋排骨(68) 京酱肉丝(48) 【总价:】168
策略113:鱼香肉丝(48) 米饭(4) 糖醋排骨(68) 毛氏红烧肉(79) 【总价:】199
策略114:鱼香肉丝(48) 米饭(4) 糖醋排骨(68) 毛氏红烧肉(79) 京酱肉丝(48) 【总价:】247
策略115:鱼香肉丝(48) 米饭(4) 糖醋排骨(68) 蒜末拍黄瓜(12) 【总价:】132
策略116:鱼香肉丝(48) 米饭(4) 糖醋排骨(68) 蒜末拍黄瓜(12) 京酱肉丝(48) 【总价:】180
策略117:鱼香肉丝(48) 米饭(4) 糖醋排骨(68) 蒜末拍黄瓜(12) 毛氏红烧肉(79) 【总价:】211
策略118:鱼香肉丝(48) 米饭(4) 糖醋排骨(68) 蒜末拍黄瓜(12) 毛氏红烧肉(79) 京酱肉丝(48) 【总价:】259
策略119:鱼香肉丝(48) 米饭(4) 糖醋排骨(68) 地锅鸡(78) 【总价:】198
策略120:鱼香肉丝(48) 米饭(4) 糖醋排骨(68) 地锅鸡(78) 京酱肉丝(48) 【总价:】246
策略121:鱼香肉丝(48) 米饭(4) 糖醋排骨(68) 地锅鸡(78) 毛氏红烧肉(79) 【总价:】277
策略122:鱼香肉丝(48) 米饭(4) 糖醋排骨(68) 地锅鸡(78) 蒜末拍黄瓜(12) 【总价:】210
策略123:鱼香肉丝(48) 米饭(4) 糖醋排骨(68) 地锅鸡(78) 蒜末拍黄瓜(12) 京酱肉丝(48) 【总价:】258
策略124:鱼香肉丝(48) 米饭(4) 糖醋排骨(68) 地锅鸡(78) 蒜末拍黄瓜(12) 毛氏红烧肉(79) 【总价:】289
策略125:蚂蚁上树(178) 【总价:】178
策略126:蚂蚁上树(178) 京酱肉丝(48) 【总价:】226
策略127:蚂蚁上树(178) 毛氏红烧肉(79) 【总价:】257
策略128:蚂蚁上树(178) 蒜末拍黄瓜(12) 【总价:】190
策略129:蚂蚁上树(178) 蒜末拍黄瓜(12) 京酱肉丝(48) 【总价:】238
策略130:蚂蚁上树(178) 蒜末拍黄瓜(12) 毛氏红烧肉(79) 【总价:】269
策略131:蚂蚁上树(178) 地锅鸡(78) 【总价:】256
策略132:蚂蚁上树(178) 地锅鸡(78) 蒜末拍黄瓜(12) 【总价:】268
策略133:蚂蚁上树(178) 糖醋排骨(68) 【总价:】246
策略134:蚂蚁上树(178) 糖醋排骨(68) 京酱肉丝(48) 【总价:】294
策略135:蚂蚁上树(178) 糖醋排骨(68) 蒜末拍黄瓜(12) 【总价:】258
策略136:蚂蚁上树(178) 米饭(4) 【总价:】182
策略137:蚂蚁上树(178) 米饭(4) 京酱肉丝(48) 【总价:】230
策略138:蚂蚁上树(178) 米饭(4) 毛氏红烧肉(79) 【总价:】261
策略139:蚂蚁上树(178) 米饭(4) 蒜末拍黄瓜(12) 【总价:】194
策略140:蚂蚁上树(178) 米饭(4) 蒜末拍黄瓜(12) 京酱肉丝(48) 【总价:】242
策略141:蚂蚁上树(178) 米饭(4) 蒜末拍黄瓜(12) 毛氏红烧肉(79) 【总价:】273
策略142:蚂蚁上树(178) 米饭(4) 地锅鸡(78) 【总价:】260
策略143:蚂蚁上树(178) 米饭(4) 地锅鸡(78) 蒜末拍黄瓜(12) 【总价:】272
策略144:蚂蚁上树(178) 米饭(4) 糖醋排骨(68) 【总价:】250
策略145:蚂蚁上树(178) 米饭(4) 糖醋排骨(68) 京酱肉丝(48) 【总价:】298
策略146:蚂蚁上树(178) 米饭(4) 糖醋排骨(68) 蒜末拍黄瓜(12) 【总价:】262
策略147:蚂蚁上树(178) 鱼香肉丝(48) 【总价:】226
策略148:蚂蚁上树(178) 鱼香肉丝(48) 京酱肉丝(48) 【总价:】274
策略149:蚂蚁上树(178) 鱼香肉丝(48) 蒜末拍黄瓜(12) 【总价:】238
策略150:蚂蚁上树(178) 鱼香肉丝(48) 蒜末拍黄瓜(12) 京酱肉丝(48) 【总价:】286
策略151:蚂蚁上树(178) 鱼香肉丝(48) 糖醋排骨(68) 【总价:】294
策略152:蚂蚁上树(178) 鱼香肉丝(48) 米饭(4) 【总价:】230
策略153:蚂蚁上树(178) 鱼香肉丝(48) 米饭(4) 京酱肉丝(48) 【总价:】278
策略154:蚂蚁上树(178) 鱼香肉丝(48) 米饭(4) 蒜末拍黄瓜(12) 【总价:】242
策略155:蚂蚁上树(178) 鱼香肉丝(48) 米饭(4) 蒜末拍黄瓜(12) 京酱肉丝(48) 【总价:】290
策略156:蚂蚁上树(178) 鱼香肉丝(48) 米饭(4) 糖醋排骨(68) 【总价:】298
策略二运行结果
策略二是在策略1的基础上指定了点菜数目,该Demo中指定的菜数量是2,因此该策略集中都是数量为2的策略并且不超过用户所带总金额(300元)。运行结果符合上述要求。
策略1:毛氏红烧肉(79) 京酱肉丝(48) 【总价:】127
策略2:蒜末拍黄瓜(12) 京酱肉丝(48) 【总价:】60
策略3:蒜末拍黄瓜(12) 毛氏红烧肉(79) 【总价:】91
策略4:地锅鸡(78) 京酱肉丝(48) 【总价:】126
策略5:地锅鸡(78) 毛氏红烧肉(79) 【总价:】157
策略6:地锅鸡(78) 蒜末拍黄瓜(12) 【总价:】90
策略7:糖醋排骨(68) 京酱肉丝(48) 【总价:】116
策略8:糖醋排骨(68) 毛氏红烧肉(79) 【总价:】147
策略9:糖醋排骨(68) 蒜末拍黄瓜(12) 【总价:】80
策略10:糖醋排骨(68) 地锅鸡(78) 【总价:】146
策略11:米饭(4) 京酱肉丝(48) 【总价:】52
策略12:米饭(4) 毛氏红烧肉(79) 【总价:】83
策略13:米饭(4) 蒜末拍黄瓜(12) 【总价:】16
策略14:米饭(4) 地锅鸡(78) 【总价:】82
策略15:米饭(4) 糖醋排骨(68) 【总价:】72
策略16:鱼香肉丝(48) 京酱肉丝(48) 【总价:】96
策略17:鱼香肉丝(48) 毛氏红烧肉(79) 【总价:】127
策略18:鱼香肉丝(48) 蒜末拍黄瓜(12) 【总价:】60
策略19:鱼香肉丝(48) 地锅鸡(78) 【总价:】126
策略20:鱼香肉丝(48) 糖醋排骨(68) 【总价:】116
策略21:鱼香肉丝(48) 米饭(4) 【总价:】52
策略22:蚂蚁上树(178) 京酱肉丝(48) 【总价:】226
策略23:蚂蚁上树(178) 毛氏红烧肉(79) 【总价:】257
策略24:蚂蚁上树(178) 蒜末拍黄瓜(12) 【总价:】190
策略25:蚂蚁上树(178) 地锅鸡(78) 【总价:】256
策略26:蚂蚁上树(178) 糖醋排骨(68) 【总价:】246
策略27:蚂蚁上树(178) 米饭(4) 【总价:】182
策略28:蚂蚁上树(178) 鱼香肉丝(48) 【总价:】226
总结
该案例是回溯算法在现实场景中的一个简单的应用demo,当然实际的业务中可能会有各式各样的场景,只要有类似的过程——求问题的解会分成若干步,每一步又面临同样的选择,此时可以考虑使用回溯算法来解决,需要注意的是回溯算法中重要的是记得要状态回溯,想上面代码中的removeLast()
方法就是状态回溯的步骤。
个人主页:欢迎访问
以上的算法题目对应LeetCode的题号: