【递归到动态规划】: 背包问题

题目

在这里插入图片描述

代码

递归版

// index 0~N
// rest 负~bag,表示背包剩余空间
public static int process(int[] w, int[] v, int index, int rest) {
    
    
	if (rest < 0) {
    
    
		//返回-1,表示该方案舍弃
		return -1;
	}
	if (index == w.length) {
    
    
		return 0;
	}
	//第一种可能性:第index位置的货物没拿
	int p1 = process(w, v, index + 1, rest);
	int p2 = 0;
	//要当前的货
	int next = process(w, v, index + 1, rest - w[index]);
	if (next != -1) {
    
    
		p2 = v[index] + next;
	}
	return Math.max(p1, p2);
}

动态规划版

我们再递归时候怎么调,就怎么写

public static int dp(int[] w, int[] v, int bag) {
    
    
	if (w == null || v == null || w.length != v.length || w.length == 0) {
    
    
		return 0;
	}
	int N = w.length;
	int[][] dp = new int[N + 1][bag + 1];
	for (int index = N - 1; index >= 0; index--) {
    
    
		for (int rest = 0; rest <= bag; rest++) {
    
    
			int p1 = dp[index + 1][rest];
			int p2 = 0;
			int next = rest - w[index] < 0 ? -1 : dp[index + 1][rest - w[index]];
			if (next != -1) {
    
    
				p2 = v[index] + next;
			}
			dp[index][rest] = Math.max(p1, p2);
		}
	}
	return dp[0][bag];
}

猜你喜欢

转载自blog.csdn.net/VanGotoBilibili/article/details/115228326