diff --git a/IntDivision/JAVA/IntDivision.java b/IntDivision/JAVA/IntDivision.java index 1d4a06d..ce1dc82 100644 --- a/IntDivision/JAVA/IntDivision.java +++ b/IntDivision/JAVA/IntDivision.java @@ -21,7 +21,7 @@ public static void main (String[] args) { public static int fun(int n, int m) { if (n < 1 || m < 1) { return 0; - } else if (n == 1 || m == 1) { + } else if (n == 1 && m == 1) { return 1; } else if (n < m) { return fun(n, n); diff --git a/MatrixMultiply/JAVA/MatrixMultiply.java b/MatrixMultiply/JAVA/MatrixMultiply.java index 4ebe8c4..3e26e12 100644 --- a/MatrixMultiply/JAVA/MatrixMultiply.java +++ b/MatrixMultiply/JAVA/MatrixMultiply.java @@ -5,7 +5,7 @@ import java.util.Scanner; -class MatrixMultiply { +public class MatrixMultiply { static int[][] s = new int[100][100]; @@ -45,7 +45,7 @@ public static int RMC (int i, int j, int[] p) { int u = RMC(i, i, p) + RMC(i + 1, j, p) + p[i - 1] * p[i] * p[j]; s[i][j] = i; for (int k = i + 1; k < j; k++) { - int t = RMC(i, k, p) + RMC(k + 1, j, p) + p[i - 1] * p[i] * p[j]; + int t = RMC(i, k, p) + RMC(k + 1, j, p) + p[i - 1] * p[k] * p[j]; if (t < u) { u = t; s[i][j] = k; diff --git a/Perm/JAVA/Perm.java b/Perm/JAVA/Perm.java index e261ed4..83de5cf 100644 --- a/Perm/JAVA/Perm.java +++ b/Perm/JAVA/Perm.java @@ -12,7 +12,7 @@ public static void perm (Object[] list, int k, int m) { for (int i = 0; i <= m; i++) { System.out.print(list[i] + " "); } - System.out.println(); + //System.out.println(); } else { for (int i = k; i <= m; i++) { swap(list, k, i); diff --git a/README.md b/README.md index ddb1459..d1389b1 100644 --- a/README.md +++ b/README.md @@ -11,3 +11,7 @@ - [合并排序](https://github.com/PointSeven/Algorithm/blob/master/MergeSort/JAVA/MergeSort.java) - [快速排序](https://github.com/PointSeven/Algorithm/blob/master/QuickSort/JAVA/QuickSort.java) - [Fibonacci数列](https://github.com/PointSeven/Algorithm/blob/master/Fibonacci/JAVA/Fibonacci.java) + +## 第三次测试 +- [矩阵连乘](https://github.com/PointSeven/Algorithm/blob/master/MatrixMultiply/JAVA/MatrixMultiply.java) +- [0-1背包](https://github.com/PointSeven/Algorithm/blob/master/ZeroOnePack/JAVA/ZeroOnePack.java) diff --git a/ZeroOnePack/JAVA/ZeroOnePack.java b/ZeroOnePack/JAVA/ZeroOnePack.java new file mode 100644 index 0000000..af3076a --- /dev/null +++ b/ZeroOnePack/JAVA/ZeroOnePack.java @@ -0,0 +1,82 @@ +/* + * Input:4 5 2 1 3 2 12 10 20 15 + * Output:1 1 0 1 + * + * 状态转移方程: + * + * m(i, j) = max{m(i + 1, j), m(i + 1, j - w[i]) + v[i]}, j >= w[i] + * m(i + 1, j), 0 <= j < w[i] + */ + +import java.util.Scanner; + +public class ZeroOnePack { + + public static void main (String[] args) { + Scanner sc = new Scanner(System.in); + + int n = sc.nextInt(); //物品个数 + int c = sc.nextInt(); //背包容量 + + int[] w = new int[n + 1]; //物品重量 + for (int i = 1; i <= n; i++) + w[i] = sc.nextInt(); + + int[] v = new int[n + 1]; //物品价值 + for (int i = 1; i <= n; i++) + v[i] = sc.nextInt(); + + int[][] m = new int[n + 1][c + 1]; //状态表 + knapsack(v, w, c, n, m); + int[] x = new int[n + 1]; //生成解 + traceback(m, w, c, n, x); + + for (int i = 1; i <= n; i++) + System.out.print(x[i] + " "); + } + + /* + * 构造状态表 + */ + public static void knapsack (int[] v, int[] w, int c, int n, int[][] m) { + //初始化 + int iMax = Min(w[n] - 1, c); + for (int i = 0; i <= iMax; i++) + m[n][i] = 0; + for (int i = w[n]; i <= c; i++) + m[n][i] = v[n]; + + for (int i = n - 1; i > 1; i--) { + iMax = Min(w[i] - 1, c); + for (int j = 0; j <= iMax; j++) + m[i][j] = m[i + 1][j]; + for (int j = w[i]; j <= c; j++) + m[i][j] = Max(m[i + 1][j], m[i + 1][j - w[i]] + v[i]); + } + m[1][c] = m[2][c]; + if (c >= w[1]) + m[1][c] = Max(m[1][c], m[2][c - w[1]] + v[1]); + } + + /* + * 构造最优解 + */ + public static void traceback (int[][] m, int[] w, int c, int n, int[] x) { + for (int i = 1; i < n; i++) + if (m[i][c] == m[i + 1][c]) + x[i] = 0; + else { + x[i] = 1; + c -= w[i]; + } + x[n] = (m[n][c] > 0) ? 1 : 0; + } + + public static int Min (int a, int b) { + return a < b ? a : b; + } + + public static int Max (int a, int b) { + return a > b ? a : b; + } +} diff --git a/ZeroOnePack/README b/ZeroOnePack/README new file mode 100644 index 0000000..12edf16 --- /dev/null +++ b/ZeroOnePack/README @@ -0,0 +1 @@ +0-1背包问题