modify code

master
algorithmzuo 2 years ago
parent f488b8dbb6
commit f067fdb8ba

@ -1,63 +0,0 @@
package 03.mca_09;
public class Code04_Knapsack {
// 所有的货重量和价值都在w和v数组里
// 为了方便,其中没有负数
// bag背包容量不能超过这个载重
// 返回:不超重的情况下,能够得到的最大价值
public static int maxValue(int[] w, int[] v, int bag) {
if (w == null || v == null || w.length != v.length || w.length == 0) {
return 0;
}
// 尝试函数!
return process(w, v, 0, bag);
}
// index 0~N
// rest 负~bag
public static int process(int[] w, int[] v, int index, int rest) {
if (rest < 0) {
return -1;
}
if (index == w.length) {
return 0;
}
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];
}
public static void main(String[] args) {
int[] weights = { 3, 2, 4, 7, 3, 1, 7 };
int[] values = { 5, 6, 3, 19, 12, 4, 2 };
int bag = 15;
System.out.println(maxValue(weights, values, bag));
System.out.println(dp(weights, values, bag));
}
}

@ -0,0 +1,97 @@
package 03.mca_09;
// 背包问题
// 测试链接 : https://www.nowcoder.com/practice/fd55637d3f24484e96dad9e992d3f62e
// 请同学们务必参考如下代码中关于输入、输出的处理
// 这是输入输出处理效率很高的写法
// 提交以下所有代码把主类名改成Main可以直接通过
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
public class Code04_Knapsack1 {
public static int MAXN = 1010;
public static int[] v = new int[MAXN];
public static int[] w = new int[MAXN];
public static int[][] dp = new int[MAXN][MAXN];
public static int n, m;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StreamTokenizer in = new StreamTokenizer(br);
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
while (in.nextToken() != StreamTokenizer.TT_EOF) {
n = (int) in.nval;
in.nextToken();
m = (int) in.nval;
for (int i = 0; i < n; i++) {
in.nextToken();
v[i] = (int) in.nval;
in.nextToken();
w[i] = (int) in.nval;
}
clear();
int ans1 = f1(0, m);
clear();
int ans2 = f2(0, m);
out.println(ans1);
out.println(ans2 == -1 ? 0 : ans2);
out.flush();
}
}
public static void clear() {
for (int i = 0; i < n; i++) {
for (int j = 0; j <= m; j++) {
dp[i][j] = -2;
}
}
}
public static int f1(int i, int j) {
if (j < 0) {
return -1;
}
if (i == n) {
return 0;
}
if (dp[i][j] != -2) {
return dp[i][j];
}
int p1 = f1(i + 1, j);
int p2 = 0;
int next2 = f1(i + 1, j - v[i]);
if (next2 != -1) {
p2 = w[i] + next2;
}
int ans = Math.max(p1, p2);
dp[i][j] = ans;
return ans;
}
public static int f2(int i, int j) {
if (j < 0) {
return -1;
}
if (i == n) {
return j == 0 ? 0 : -1;
}
if (dp[i][j] != -2) {
return dp[i][j];
}
int p1 = f2(i + 1, j);
int p2 = -1;
int next2 = f2(i + 1, j - v[i]);
if (next2 != -1) {
p2 = w[i] + next2;
}
int ans = Math.max(p1, p2);
dp[i][j] = ans;
return ans;
}
}

@ -0,0 +1,76 @@
package 03.mca_09;
// 背包问题
// 测试链接 : https://www.nowcoder.com/practice/fd55637d3f24484e96dad9e992d3f62e
// 请同学们务必参考如下代码中关于输入、输出的处理
// 这是输入输出处理效率很高的写法
// 提交以下所有代码把主类名改成Main可以直接通过
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
public class Code04_Knapsack2 {
public static int MAXN = 1010;
public static int[] v = new int[MAXN];
public static int[] w = new int[MAXN];
public static int[][] dp = new int[MAXN][MAXN];
public static int n, m;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StreamTokenizer in = new StreamTokenizer(br);
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
while (in.nextToken() != StreamTokenizer.TT_EOF) {
n = (int) in.nval;
in.nextToken();
m = (int) in.nval;
for (int i = 0; i < n; i++) {
in.nextToken();
v[i] = (int) in.nval;
in.nextToken();
w[i] = (int) in.nval;
}
int ans1 = f1();
int ans2 = f2();
out.println(ans1);
out.println(ans2 == -1 ? 0 : ans2);
out.flush();
}
}
public static int f1() {
for (int j = 0; j <= m; j++) {
dp[n][j] = 0;
}
for (int i = n - 1; i >= 0; i--) {
for (int j = 0; j <= m; j++) {
dp[i][j] = dp[i + 1][j];
if (j - v[i] >= 0) {
dp[i][j] = Math.max(dp[i][j], w[i] + dp[i + 1][j - v[i]]);
}
}
}
return dp[0][m];
}
public static int f2() {
dp[n][0] = 0;
for (int j = 1; j <= m; j++) {
dp[n][j] = -1;
}
for (int i = n - 1; i >= 0; i--) {
for (int j = 0; j <= m; j++) {
dp[i][j] = dp[i + 1][j];
if (j - v[i] >= 0 && dp[i + 1][j - v[i]] != -1) {
dp[i][j] = Math.max(dp[i][j], w[i] + dp[i + 1][j - v[i]]);
}
}
}
return dp[0][m];
}
}

@ -0,0 +1,74 @@
package 03.mca_09;
// 背包问题
// 测试链接 : https://www.nowcoder.com/practice/fd55637d3f24484e96dad9e992d3f62e
// 请同学们务必参考如下代码中关于输入、输出的处理
// 这是输入输出处理效率很高的写法
// 提交以下所有代码把主类名改成Main可以直接通过
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
public class Code04_Knapsack3 {
public static int MAXN = 1010;
public static int[] v = new int[MAXN];
public static int[] w = new int[MAXN];
public static int[] dp = new int[MAXN];
public static int n, m;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StreamTokenizer in = new StreamTokenizer(br);
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
while (in.nextToken() != StreamTokenizer.TT_EOF) {
n = (int) in.nval;
in.nextToken();
m = (int) in.nval;
for (int i = 0; i < n; i++) {
in.nextToken();
v[i] = (int) in.nval;
in.nextToken();
w[i] = (int) in.nval;
}
int ans1 = f1();
int ans2 = f2();
out.println(ans1);
out.println(ans2 == -1 ? 0 : ans2);
out.flush();
}
}
public static int f1() {
for (int j = 0; j <= m; j++) {
dp[j] = 0;
}
for (int i = n - 1; i >= 0; i--) {
for (int j = m; j >= 0; j--) {
if (j - v[i] >= 0) {
dp[j] = Math.max(dp[j], w[i] + dp[j - v[i]]);
}
}
}
return dp[m];
}
public static int f2() {
dp[0] = 0;
for (int j = 1; j <= m; j++) {
dp[j] = -1;
}
for (int i = n - 1; i >= 0; i--) {
for (int j = m; j >= 0; j--) {
if (j - v[i] >= 0 && dp[j - v[i]] != -1) {
dp[j] = Math.max(dp[j], w[i] + dp[j - v[i]]);
}
}
}
return dp[m];
}
}
Loading…
Cancel
Save