java吧 关注:1,272,002贴子:12,782,448
  • 8回复贴,共1

算法题,求大神

只看楼主收藏回复



IP属地:江苏1楼2021-06-11 14:19回复
    遇到啥问题啊?


    IP属地:安徽2楼2021-06-11 14:33
    回复
      2025-08-01 04:56:08
      广告
      不感兴趣
      开通SVIP免广告
      帮你写下吧,题目不难,重在理解
      主要理解我代码里的41行,这行理解了基本上就没问题了



      完整代码
      package day0611;
      import java.util.ArrayList;
      import java.util.List;
      public class Demo1 {
      static int count = 0;
      public static void main(String[] args) {
      //控制台输入过程自己写
      int n = 4, m = 2;
      System.out.println("输出------");
      comb(n,m);
      System.out.println("总数:"+count);
      }
      //从1-n中选出m个数
      static void comb(int n,int m) {
      List<Integer> line = new ArrayList<Integer>();
      combnext(line,n,m);
      }
      //对于每一个行再添加一个
      static void combnext(List<Integer> line,int n,int m) {
      int sta = 0;
      if(line.size() != 0) {//去line中已存在的最大数
      sta = line.get(line.size()-1);
      }
      //最大数与n间的差距,则为都可以添加的值
      //比如最大数为2,n为5,那么下一个可添加的数可以是3,4,5
      for(int i=sta+1;i<=n;i++) {
      line.add(i);//line 增加一个数后
      if(line.size() == m) {//已经满足条件
      printLine(line);
      count++;
      }else {//不满足继续添加
      //调用自身进行迭代
      combnext(line,n,m);
      }
      //最关键的一步 移除最后添加的一个进行回溯
      line.remove(line.size()-1);
      }
      }
      static void printLine(List<Integer> line) {
      for(int i:line) {
      System.out.print(i+" ");
      }
      System.out.println("");
      }
      }


      3楼2021-06-11 16:10
      收起回复
        package csq;
        import java.util.ArrayList;
        import java.util.List;
        import java.util.Stack;
        public class CombineCount {
        public static Stack<Integer> stack = new Stack<Integer>();
        public static void main(String[] args) {
        //-数字在这里定义-
        int n = 4;//
        int m = 2;//
        start(n, m);//
        //----------------
        }
        public static void start(int n, int m){
        List<Integer> list = new ArrayList<Integer>();
        for(int i = 1 ; i <= n; i++){
        list.add(i);
        }
        combine(list, m, 0);
        }
        private static void combine(List<Integer> list, int targ, int cur) {
        if(cur == targ) {
        System.out.println(stack);
        return;
        }
        for(int i=0;i<list.size();i++) {
        if(!stack.contains(list.get(i))) {
        if(judgeInc(stack, list.get(i))){
        continue;
        }
        stack.add(list.get(i));
        combine(list, targ, cur+1);
        stack.pop();
        }
        }
        }
        private static boolean judgeInc(Stack<Integer> stack, int incNum) {
        if(stack.isEmpty()){
        return false;
        }else if(stack.get(stack.size()-1) >= incNum){
        //System.out.println(stack+" "+stack.get(stack.size()-1));
        return true;
        }else{
        return false;
        }
        }
        }


        IP属地:江西4楼2021-06-11 16:23
        回复
          还要显示几种,忘了,加上去
          package csq;
          import java.util.ArrayList;
          import java.util.List;
          import java.util.Stack;
          public class CombineCount {
          public static Stack<Integer> stack = new Stack<Integer>();
          static int allCount = 0;
          public static void main(String[] args) {
          //-数字在这里定义-
          int n = 4;//
          int m = 2;//
          start(n, m);//
          //----------------
          System.out.println("共"+allCount+"种");
          }
          public static void start(int n, int m){
          List<Integer> list = new ArrayList<Integer>();
          for(int i = 1 ; i <= n; i++){
          list.add(i);
          }
          combine(list, m, 0);
          }
          private static void combine(List<Integer> list, int targ, int cur) {
          if(cur == targ) {
          System.out.println(stack);
          allCount++;
          return;
          }
          for(int i=0;i<list.size();i++) {
          if(!stack.contains(list.get(i))) {
          if(judgeInc(stack, list.get(i))){
          continue;
          }
          stack.add(list.get(i));
          combine(list, targ, cur+1);
          stack.pop();
          }
          }
          }
          private static boolean judgeInc(Stack<Integer> stack, int incNum) {
          if(stack.isEmpty()){
          return false;
          }else if(stack.get(stack.size()-1) >= incNum){
          //System.out.println(stack+" "+stack.get(stack.size()-1));
          return true;
          }else{
          return false;
          }
          }
          }


          IP属地:江西5楼2021-06-11 16:31
          回复
            求组合c42就c42,搞得这么复杂,害我一下都没读懂题目。


            IP属地:浙江来自Android客户端6楼2021-06-12 18:31
            回复
              双循环for(var i=0;i小于m;i++){
              for(var j=0;j小于m-i;j++){}}


              IP属地:浙江来自Android客户端7楼2021-06-12 18:38
              回复