public class Test48 { //给定两个长度都为N的数组weights和values //weights[i]和values[i]分别表示i号物品的重量和价值 //给定一个正数bag表示一个载重bag的袋子 //装的物品不能超过这个重量 //返回最多装的价值 //法一 public static int getMaxValue(int[] w , int[] v ,int bag) { return process1(w , v , 0 , 0, bag); } //所有重量在w[],所有价值在v[] //alreadyW为0……index-1上选择的总重量 //bag为总载重 //返回index往后的货的价值 public static int process1(int[] w , int[] v , int index , int alreadyW , int bag) { if (alreadyW > bag) { return -1; } if (index == w.length) { return 0; } //第一种可能性:index的货不加,看后续最大价值 int p1 = process1(w , v ,index + 1 , alreadyW , bag); //第二种可能性:加上index的货,看后续最大价值 int p2next = process1(w , v , index + 1 , alreadyW + w[index] , bag); int p2 = -1; if (p2next != -1) {//如果第二种可能性存在,那么计算其后续的价值 p2 = v[index] + p2next; } return Math.max(p1 , p2); } //法二 public static int maxValue(int[] w , int[] v ,int bag) { return process2(w , v ,0 , bag); } //只剩下rest空间 //index及其后面的货自动选择,但剩余空间不小于0 //返回index及其后面货物的最大价值 public static int process2(int[] w , int[] v ,int index , int rest) { if (rest < 0) { return -1; } if (index == w.length) { return 0; } //第一种可能性:不要当前的货,看后续价值 int p1 = process2(w , v , index + 1 , rest); //第二种可能性:要当前的货,看后续价值 int p2 = -1; int p2next = process2(w , v , index + 1 , rest - w[index]); if (p2next != -1) {//如果p2可能性存在,计算后续价值 p2 = v[index] + p2next; } return Math.max(p1 , p2); } }
从左往右的尝试模型题2
最新推荐文章于 2024-09-27 00:45:01 发布