编程之美 - 1.6 饮料供货 ☞ 【记忆化搜索】

上接:编程之美 - 1.6 饮料供货 ☞ 【动态规划】

    package Chapter1;
     
    import java.io.*;
     
    public class Func_1_6_2 {
        Beverage []beverages = null;
        int [][]opt = null;
        public static void main(String []args) {
            Func_1_6_2 f = new Func_1_6_2();
            f.beverages = f.getData("/home/peerslee/data/BeautyProgramming/Func_1_6.txt");
            f.opt = f.getOpt(f.beverages, 7);
            System.out.println(f.digitSatisfy2(7,0));
            for (int []i : f.opt) {
                for (int j : i) {
                    System.out.print(j + " ");
                }
                System.out.println();
            }
        }
        // 初始化opt 数组 -> 备忘录
        int [][]getOpt(Beverage []beverages, int volume) {
            int [][]opt = new int[volume+1][beverages.length];
            for (int i = 0; i <= volume; i++) {
                for (int j = 0; j < beverages.length; j++) opt[i][j] = -1;
            }
            return opt;
        }
        // 使用记忆化搜索方式
        int digitSatisfy2(int volume, int type) { // type从0开始
            int INF = 1000;
     
            // 最后一层
            if (type == this.beverages.length-1) {
                if (volume == 0) return 0;
                else return -INF;
            }
     
            // 剪枝
            if (volume < 0) return -INF;
            else if (volume == 0) return 0;
            else if (opt[volume][type] != -1) return opt[volume][type]; //子问题已经求解
     
            int res = -INF;
            for (int i = 0; i <= this.beverages[type].count; i++) {
                int temp = digitSatisfy2(volume - i*this.beverages[type].content, type+1);
                if (temp != -INF) {
                    temp += i * this.beverages[type].mark;
                    if (temp > res) res = temp;
                }
            }
            // 1. 记忆, 2. 返回值
            return opt[volume][type] = res; // v,t 已经确定,这个枝节只走一次
     
        }
        // 饮料
        class Beverage {
            int mark; // 打分
            int content; // 容量
            int count; // 数量
     
            public Beverage(int mark, int content, int count) {
                this.mark = mark;
                this.content = content;
                this.count = count;
            }
        }
        // 将string 转int
        int[] parseInt(String []str) {
            int []res = new int[str.length];
            for (int i = 0; i < str.length; i++) {
                res[i] = Integer.parseInt(str[i]);
            }
            return res;
        }
        // 得到data
        Beverage[] getData(String file_path) {
            Beverage []beverages;
            BufferedReader reader = null;
            try {
                reader = new BufferedReader(
                        new InputStreamReader(
                                new FileInputStream(
                                        new File(file_path))));
                String line = null;
                String []str;
                int []digit;
     
                int total = Integer.parseInt(reader.readLine());
     
                beverages = new Beverage[total];
                for (int i = 0; i < total; i++) {
                    if ((line = reader.readLine()) != null) {
                        str = line.split(" ");
                        digit = parseInt(str);
                        int mark = digit[0];
                        int content = digit[1];
                        int count = digit[2];
                        beverages[i] = new Beverage(mark, content, count);
                    }
                }
                return beverages;
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }
    }


33
-1 -1 -1 -1 -1 -1 -1 -1 -1
-1 -1 -1 4 -1000 -1000 -1000 -1000 -1
-1 -1 -1 8 6 5 4 -1000 -1
-1 -1 15 12 -1000 -1000 -1000 -1000 -1
-1 -1 19 18 18 18 18 18 -1
-1 23 23 22 -1000 -1000 -1000 -1000 -1
-1 28 28 26 24 23 22 -1000 -1
33 33 33 30 -1000 -1000 -1000 -1000 -1
---------------------
作者:PeersLee
来源:CSDN
原文:https://blog.csdn.net/PeersLee/article/details/77450586
版权声明:本文为博主原创文章,转载请附上博文链接!

posted @ 2019-07-19 11:41  天涯海角路  阅读(85)  评论(0)    收藏  举报