当前位置:   article > 正文

动态规划-将一个正整数数组拆分成两个相等的子数组_数组中两组和相同的子序列

数组中两组和相同的子序列
  1. package com.algorithm.dynamicprogramming;
  2. /**
  3. * 题目描述:将一个正整数数组拆分成两个相同的子数组,如果能,返回true,如果不能返回false。
  4. *
  5. * Input: [1, 5, 11, 5]
  6. *
  7. * Output: true
  8. *
  9. * Explanation: The array can be partitioned as [1, 5, 5] and [11].
  10. *
  11. *
  12. * Input: [1, 2, 3, 5]
  13. *
  14. * Output: false
  15. *
  16. * Explanation: The array cannot be partitioned into equal sum subsets.
  17. *
  18. * @author rich
  19. *
  20. */
  21. public class PartitionEqualSubsetSum {
  22. public static void main(String[] args) {
  23. int[] arrs = new int[] {1, 5, 11, 5};
  24. System.out.println(partitionEqualSubsetSum(arrs));
  25. }
  26. /**
  27. * 算法分析:理论是就是将子数组是否等于sum/2
  28. * @param arrs
  29. * @return
  30. */
  31. public static boolean partitionEqualSubsetSum(int[] arrs) {
  32. if (arrs.length < 2) return false;
  33. int sum = 0;
  34. for (int i = 0; i < arrs.length; i++) {
  35. sum += arrs[i];
  36. }
  37. if (sum % 2 != 0) return false;
  38. return partitionEqualSubsetSum(arrs.length-1,arrs,sum/2);
  39. }
  40. /**
  41. * 递归方法
  42. * @param n
  43. * @param arrs
  44. * @param k
  45. * @return
  46. */
  47. public static boolean partitionEqualSubsetSum(int n,int[] arrs,int k) {
  48. if (k == 0) return true;
  49. if (n == 0 && arrs[n] == k) return true;
  50. else if (n == 0 && arrs[n] != k) return false;
  51. if (arrs[n] > k) return false;
  52. return partitionEqualSubsetSum(n-1,arrs,k) || partitionEqualSubsetSum(n-1,arrs,k-arrs[n]);
  53. }
  54. /**
  55. * 循环
  56. * @param n
  57. * @param arrs
  58. * @param k
  59. * @return
  60. */
  61. public static boolean partitionEqualSubsetSum(int[] arrs,int k) {
  62. // 初始化状态数组
  63. boolean[][] memo = new boolean[arrs.length][k+1];
  64. // 初始化状态
  65. for (int i = 0;i<arrs.length;i++) {
  66. memo[i][0] = true;
  67. }
  68. for (int i = 0;i<k+1;i++) {
  69. memo[0][i] = false;
  70. }
  71. memo[0][arrs[0]] = true;
  72. for (int i = 1;i<arrs.length;i++) {
  73. for (int j = 1;j<k+1;j++) {
  74. if (arrs[i]>j) { //
  75. memo[i][j] = false;
  76. }
  77. else {
  78. boolean a = memo[i-1][j];
  79. boolean b = memo[i-1][j-arrs[i]];
  80. memo[i][j] = a|| b;
  81. }
  82. }
  83. }
  84. return memo[arrs.length-1][k];
  85. }
  86. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/64297
推荐阅读
相关标签
  

闽ICP备14008679号