编程之美 - 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
版权声明:本文为博主原创文章,转载请附上博文链接!

浙公网安备 33010602011771号