楼主: heronalps
跳转到指定楼层
上一主题 下一主题
收起左侧

亚马逊OA - 订单匹配问题

🔗
dadadaxian 2018-3-12 10:01:23 | 只看该作者
全局:
参考了下 “背包问题九讲”中的二维费用问题,这道题应该可以用三维费用DP来解吧。 F[i, x1, x2, x3] = max{}
回复

使用道具 举报

🔗
dadadaxian 2018-3-12 10:05:03 | 只看该作者
全局:
您好!
本帖隐藏的内容需要积分高于 100 才可浏览
您当前积分为 0。
使用VIP即刻解锁阅读权限或查看其他获取积分的方式
游客,您好!
本帖隐藏的内容需要积分高于 100 才可浏览
您当前积分为 0。
VIP即刻解锁阅读权限查看其他获取积分的方式
Unlock interview details and practice with AI
Curated Interview Questions from Top Companies
回复

使用道具 举报

🔗
 楼主| heronalps 2018-3-12 23:53:58 | 只看该作者
全局:
您好!
本帖隐藏的内容需要积分高于 100 才可浏览
您当前积分为 0。
使用VIP即刻解锁阅读权限或查看其他获取积分的方式
游客,您好!
本帖隐藏的内容需要积分高于 100 才可浏览
您当前积分为 0。
VIP即刻解锁阅读权限查看其他获取积分的方式
Unlock interview details and practice with AI
Curated Interview Questions from Top Companies
回复

使用道具 举报

🔗
 楼主| heronalps 2018-3-12 23:55:30 | 只看该作者
全局:
您好!
本帖隐藏的内容需要积分高于 100 才可浏览
您当前积分为 0。
使用VIP即刻解锁阅读权限或查看其他获取积分的方式
游客,您好!
本帖隐藏的内容需要积分高于 100 才可浏览
您当前积分为 0。
VIP即刻解锁阅读权限查看其他获取积分的方式
Unlock interview details and practice with AI
Curated Interview Questions from Top Companies
回复

使用道具 举报

全局:
我在阿里也碰到一样的题目,本来以为和leetcode上面的那道shopping offers一样,没想到同样的套路根本行不通,也是不知道改怎么下手。

帮顶,期待大神解答。
回复

使用道具 举报

全局:
另外,楼主,可否把英文版本的题目发一下?
回复

使用道具 举报

全局:
求人不如求己...已经搞定了,用的是backtracking,之前想复杂了

  1. /*
  2. 一个淘宝的订单中包含n(10>=n>=1)种商品A1,A2,...,An,每种商品数量分别为a1,a2,...,an个,记做{a1,a2,...,an}(ak>0)。

  3. 订单在仓库生产过程中,仓库为了提升作业效率,会提前对热门组合商品进行预包装。
  4. 假设这n个商品有m(9>=m>=1)个商品组合,每个组合bomk包含A1,A2,...,An的数量分别为{b1,b2,...,bn}(bk>=0,至少存在一个bk>0)



  5. 举例如下:

  6. 订单包含A,B,C商品,数量为{2,3,1},商品组合bom1{2,1,1},bom2{1,1,0},bom3{0,1,1}



  7. 对以上订单匹配给定商品组合,得到的可能匹配结果为:res1.匹配到组合1一套,剩余B商品;res2.匹配到组合2两套,组合3一套,不剩商品;

  8. 现要求订单的最优匹配,最优匹配的原则为:1.匹配组合后,剩余商品种类数越少越好;2.在剩余商品种类数相同的情况下,匹配到的组合种类数越少越好;

  9. 例如上面例子,我们认为res2优于res1。



  10. 现需要编写程序,输入格式为:

  11. n,m

  12. a1,a2,...,an

  13. bom1,b11,b12,...,b1n

  14. bom2,b21,b22,...,b2n

  15. ....

  16. bomm,bm1,bm2,...,bmn



  17. 输入数据的格式说明(数据间使用英文逗号分隔):

  18. 第一行数据:n个商品,m个预包方案

  19. 第二行数据:商品1个数,商品2个数,。。。,商品n个数

  20. 第三行数据:bom1,商品1个数,商品2个数,。。。,商品n个数

  21. 第n-1行数据:。。。。

  22. 第n行数据:bomn,商品1个数,商品2个数,。。。,商品n个数



  23. 针对输入数据找出最优匹配,输出最优匹配的组合及套数,比如针对上面的例子输出:

  24. match result:

  25. bom2*2,bom3*1

  26. 注:输出结果有多个时可以乱序
  27. */

  28. import java.util.ArrayList;
  29. import java.util.HashMap;
  30. import java.util.List;
  31. import java.util.Map;
  32. import java.util.Scanner;

  33. public class Main {
  34.     /** 请完成下面这个函数,实现题目要求的功能 **/
  35.     /** 当然,你也可以不按照这个模板来作答,完全按照自己的想法来 ^-^  **/
  36.     private static Map<String, Integer> optimalCombos;
  37.     private static Map<String, Integer> currentCombos;
  38.     private static int minLeftKinds = Integer.MAX_VALUE;

  39.     public static void main(String[] args) {

  40.         List<Integer> order = new ArrayList<Integer>();
  41.         Map<String, List<Integer>> boms = new HashMap<String, List<Integer>>();

  42.         Scanner in = new Scanner(System.in);
  43.         String line = in.nextLine();

  44.         Integer n = Integer.parseInt(line.split(",")[0]);
  45.         Integer m = Integer.parseInt(line.split(",")[1]);

  46.         line = in.nextLine();
  47.         String[] itemCnt = line.split(",");
  48.         for(int i = 0; i < n ; i++){
  49.             order.add(Integer.parseInt(itemCnt[i]));
  50.         }

  51.         for(int i = 0; i < m; i++){
  52.             line = in.nextLine();
  53.             String[] bomInput = line.split(",");
  54.             List<Integer> bomDetail = new ArrayList<Integer>();

  55.             for(int j = 1; j <= n; j++ ){
  56.                 bomDetail.add(Integer.parseInt(bomInput[j]));
  57.             }
  58.             boms.put(bomInput[0], bomDetail);
  59.         }
  60.         in.close();

  61.         Map<String, Integer> res = resolve(order, boms);

  62.         System.out.println("match result:");
  63.         for(String key : res.keySet()){
  64.             System.out.println(key+"*"+res.get(key));
  65.         }
  66.     }

  67.     // write your code here
  68.     public static Map<String, Integer> resolve(List<Integer> order, Map<String, List<Integer>> boms) {
  69.         optimalCombos = new HashMap<>();
  70.         currentCombos = new HashMap<>();
  71.         minLeftKinds = Integer.MAX_VALUE;

  72.         return resolve(order, boms, 1);
  73.     }

  74.     private static Map<String, Integer> resolve(List<Integer> order, Map<String, List<Integer>> boms, int depth) {
  75.         for (int i = 1; i <= boms.size(); i++) {
  76. //            System.out.println("depth = "+ depth);
  77. //            System.out.println("i = " + i);
  78. //            System.out.println("minLeftKinds = " + minLeftKinds);
  79. //            System.out.println("currentCombos:" + currentCombos);
  80. //            System.out.println("optimalCombos:" + optimalCombos);
  81. //            System.out.println("-------------------------------");

  82.             List<Integer> combo = boms.get("bom" + i);
  83.             if (isValidCombo(order, combo)) {
  84.                 deductCombo(order, combo);
  85.                 currentCombos.put("bom" + i, currentCombos.getOrDefault("bom" + i, 0) + 1);

  86.                 resolve(order, boms, depth + 1);

  87.                 addCombo(order, combo);
  88.                 currentCombos.put("bom" + i, currentCombos.get("bom" + i) - 1);
  89.             } else {
  90.                 int leftKinds = kindOfItemsInList(order);
  91.                 if (leftKinds < minLeftKinds) {
  92.                     minLeftKinds = leftKinds;
  93.                     optimalCombos = new HashMap<>(currentCombos);
  94.                 } else if (leftKinds == minLeftKinds) {
  95.                     if (kindOfCombos(currentCombos) < kindOfCombos(optimalCombos)) {
  96.                         optimalCombos = new HashMap<>(currentCombos);
  97.                     }
  98.                 }
  99.             }
  100.         }

  101.         return optimalCombos;
  102.     }

  103.     public static int kindOfItemsInList(List<Integer> list) {
  104.         int count = 0;
  105.         for(int i = 0; i < list.size(); i++) {
  106.             if (list.get(i) > 0) {
  107.                 count++;
  108.             }
  109.         }
  110.         return count;
  111.     }

  112.     public static boolean isValidCombo(List<Integer> items, List<Integer> combo) {
  113.         for (int i = 0; i < combo.size(); i++) {
  114.             if (items.get(i) < combo.get(i)) {
  115.                 return false;
  116.             }
  117.         }
  118.         return true;
  119.     }

  120.     public static void deductCombo(List<Integer> items, List<Integer> combo) {
  121.         for (int i = 0; i < combo.size(); i++) {
  122.             items.set(i, items.get(i) - combo.get(i));
  123.         }
  124.     }

  125.     public static void addCombo(List<Integer> items, List<Integer> combo) {
  126.         for (int i = 0; i < combo.size(); i++) {
  127.             items.set(i, items.get(i) + combo.get(i));
  128.         }
  129.     }

  130.     public static int kindOfCombos(Map<String, Integer> combos) {
  131.         int count = 0;
  132.         for(int i = 1; i <= combos.size(); i++) {
  133.             if (combos.getOrDefault("bom" + i, 0) != 0) {
  134.                 count++;
  135.             }
  136.         }
  137.         return count;
  138.     }
  139. }
复制代码
回复

使用道具 举报

🔗
wsx247 2018-3-15 14:54:18 | 只看该作者
全局:
可以說明一下思路嗎
回复

使用道具 举报

🔗
 楼主| heronalps 2018-3-18 13:38:29 | 只看该作者
全局:
您好!
本帖隐藏的内容需要积分高于 100 才可浏览
您当前积分为 0。
使用VIP即刻解锁阅读权限或查看其他获取积分的方式
游客,您好!
本帖隐藏的内容需要积分高于 100 才可浏览
您当前积分为 0。
VIP即刻解锁阅读权限查看其他获取积分的方式
Unlock interview details and practice with AI
Curated Interview Questions from Top Companies
回复

使用道具 举报

🔗
 楼主| heronalps 2018-3-18 13:40:00 | 只看该作者
全局:
wsx247 发表于 2018-3-15 01:54
可以說明一下思路嗎

DFS,每个位置上都遍历整个comb的HashMap,直到有商品数量越界。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表