中级农民
- 积分
- 104
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2015-4-27
- 最后登录
- 1970-1-1
|
题目都不容易,感觉lz实力挺强的,答得也挺好的,
第二轮啤酒那题,我觉得lz的instinct是对的,应该是要用backtracking来做的,试着写了下,不知道对不对。
- public class BeerMachineCombination {
- private static List<List<Integer>> result;
- private static int lower, higher;
- public static List<List<Integer>> combination(BeerRange[] buckets, int minVolume, int maxVolume) {
- result = new ArrayList<List<Integer>>();
- if (buckets == null || minVolume > maxVolume || buckets.length == 0) return result;
- lower = minVolume;
- higher = maxVolume;
- helper(buckets, 0, 0, 0, new ArrayList<Integer>());
- boolean found = false;
- for (List<Integer> list : result) {
- if (list.size() > 0) {
- found = true;
- System.out.println("TRUE");
- for (int d : list) {
- System.out.print(d + " ");
- }
- System.out.println();
- }
- }
- if (!found) {
- System.out.println("FALSE");
- }
- return result;
- }
-
- private static void helper(BeerRange[] buckets, int start, int preMin, int preMax, List<Integer> temp) {
- if (preMin >= lower && preMax <= higher) {
- result.add(new ArrayList<Integer>(temp));
- return;
- }
- for (int i = start; i < buckets.length; i++) {
- int currMin = buckets[i].min, currMax = buckets[i].max;
- if (preMin + currMin > higher) continue;
- if (preMax + currMin > higher) continue;
- temp.add(i);
- helper(buckets, i, preMin + currMin, preMax + currMax, temp);
- temp.remove(temp.size() - 1);
- }
- }
-
- public static void main(String[] args) {
- // BeerRange[] beer = {new BeerRange(100,150), new BeerRange(200,250), new BeerRange(300,350)};
- BeerRange[] beer = {new BeerRange(100,150), new BeerRange(200,300), new BeerRange(300,350)};
- int minV = 300, maxV = 400;
- combination(beer, minV, maxV);
- }
- }
- class BeerRange {
- int min, max;
- BeerRange(int min, int max) {
- this.min = min;
- this.max = max;
- }
- }
复制代码 |
|