题解 | #数组分组#

package 华为.动态规划01;

import java.util.Scanner;

/*

  • 1.先将数组中3的倍数与5的倍数的数字分别相加并计算他们之间的差值

  • sum3:3的倍数数字相加之和 sum5:5的倍数数字相加之和

  • value = sum3-sum5

  • 2.计算剩余数字的和sum

  • 3.判断sum能否分为差值为value的两组数组

  • <==>sum = sum - value,判断判断剩余的数组+value能否分为和相等的两组数组

  • <==>target = sum/2,判断剩余的数组+value中能否找到若干个数来填充满容积为target的背包(以下的计算方法看leetcode之分割等和子集)

  • (注意这儿数组是带负数的,所以我们要讲剩余的数组中的数和value转化为正数,这样才和leetcode之分割等和子集完全类似)

  • /
    public class 数组分组 {
    public static void main(String[] args) {

      Scanner sc = new Scanner(System.in);
      while(sc.hasNext()){
          //输入数据个数
          int n = sc.nextInt();
          //输入数据
          int[] nums = new int[n];
          for (int i = 0; i < n; i++) {
              nums[i] = sc.nextInt();
          }
          //判断能否分为相等的两个数组
          System.out.println(canPartition(nums));
      }

    }

    private static boolean canPartition(int[] nums) {

      int len = nums.length;
      //1.先将数组中3的倍数与5的倍数的数字分别相加并计算他们之间的差值
      //2.计算剩余数字的和sum
      int[] newNums = new int[2*len];
      int sum3 = 0;
      int sum5 = 0;
      int sum = 0;
      int count = 0;
      int maxValue = Integer.MIN_VALUE;
      for (int i = 0; i < len; i++) {
          if (nums[i]%3==0) {
              sum3 = sum3 + nums[i];
          }else if (nums[i]%5==0){
              sum5 = sum5 + nums[i];
          }else{
              if(nums[i]<0){//负数变正数
                  nums[i] = -nums[i];
              }
              sum = sum + nums[i];
              newNums[count] = nums[i];
              maxValue = nums[i]>=maxValue ? nums[i]:maxValue;
              count = count + 1;
          }
      }
      int value = sum3-sum5;//计算差值
      if (value<0) {
          value = -value;
      }
      //3.判断剩余的数组+value中能否找到若干个数来填充满容积为target的背包
      newNums[count] = value;
      sum = sum + value;
      //判断能否提前退出
      if (count==0) {
          return true;
      }
      if(sum%2!=0){
          return false;
      }
      int target = sum/2;
      if (maxValue>target) {
          return false;
      }
      //递归
      boolean[][] dp = new boolean[count][target+1];
      //边界值
      dp[0][newNums[0]] = true;
      for (int i = 0; i < count; i++) {
          dp[i][0] = true;
      }
      for (int i = 1; i < count; i++) {
          for (int j = 1; j <= target; j++) {
              if (newNums[i]>j) {
                  dp[i][j] = dp[i-1][j];
              }else if(newNums[i]<=j){
                  dp[i][j] = dp[i-1][j] || dp[i-1][j-newNums[i]];
              }
          }
      }
      return dp[count-1][target];

    }
    }

全部评论

相关推荐

02-23 12:32
已编辑
门头沟学院 嵌入式工程师
King987:学历没有问题,然后既然有实习经历的话,把这个放在上面多写一点,哪怕你自己包装一下,只要能圆回来就行,既然有实习经历的话,肯定主要看实习经历之类的。然后也会主要问这里多准备准备
点赞 评论 收藏
分享
1.&nbsp;事件概述3月10日下午,华为在“心声社区”发布长达6500字通报,曝光72名正式员工及19名非雇员在非雇员招聘中存在徇私舞弊行为,多人出卖公司信息资产获利,引发热议。-&nbsp;“非雇员”一般指华为OD员工,与人力服务公司签劳动合同,以派遣方式到华为工作,薪资待遇与华为内部员工基本一致,可通过考核转正。2.&nbsp;相关传言与真相华为相关人士称暂无官方回应,很多传言细节不准确。&nbsp;华为成都研究所员工透露,此次通报主要涉及成都研究所的数据存储部门,整个数据存储业务约100余人,此次明文通报除名辞退或通报批评的有62名,“很多部门基本全开除”&nbsp;。网传任正非亲赴成都、封楼抓人等消息不实。早在2024年年中,就有...
七安有出处嘛:省流:任正非亲赴成都等消息不实,2024 年年中就有人举报了;涉及36名违规当事人,其中有13人被除名;10人有主动申报情节或情节较严重的,予以辞退处理;另有13人被劝退、个人职级降3等。另外还有26名相关管理责任人作为直接或间接管理者,被处以个人职级降6等,冻结个人涨薪、职级晋升、干部向上任命,冻结期6—12个月不等;若下属违规偶发,则仅通报批评。并没有释放100HC😂😂😂
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务