美文网首页
正整数n的有序m拆分-实现方法

正整数n的有序m拆分-实现方法

作者: 牛奶大泡芙 | 来源:发表于2018-10-31 11:46 被阅读0次

需求:输入一个正整数n,拆分成m份有多少种情况,输出,不同的顺序算不同的情况,即有序
实现方法:

// solve函数用来输入n,m 输出n的m拆分情况数组
var solve = n => callback => {
    let rest = n;       // the rest number to fill
    let working = [];   // the working array
    let i = 0;          // the current index of working array
    let mrf = -1;       // the most recently filled number
  
    while (true) {
      if (rest == 0) {
        callback(working.slice(0));
        if (i >= n) return;
        while (true) {
          --working[--i];
          ++rest;
          if (working[i] == 0) {
            working.splice(i);
          } else {
            mrf = working[i++];
            break;
          }
        }
      } else {
        let value = (i == 0 || rest < mrf) ? rest : mrf;
        mrf = working[i++] = value;
        rest -= value;
      }
    };
  };
// 输入:数组
// 输出:数组的全排序
  function permute(input) {
    var permArr = [],
    usedChars = [];
    function main(input){
      var i, ch;
      for (i = 0; i < input.length; i++) {
        ch = input.splice(i, 1)[0];
        usedChars.push(ch);
        if (input.length == 0) {
          permArr.push(usedChars.slice());
        }
        main(input);
        input.splice(i, 0, ch);
        usedChars.pop();
      }
      return permArr
    }
    return main(input);
  };
function diffPush(father, uncle) {
    console.log('middle', father, uncle);
    let compare = true;
    for(let cousin of uncle) {
        compare = true;
        for(let baby of father) {
            if(baby.toString() == cousin.toString()) {
                compare = false;
                break;
            }
        }
        compare && father.push(cousin);
    }   
    // return father;
}
  // 输入:7,3
  // 输出: 7份成3份的有序拆分二维数组
function part(n, m) {
    var all = [];
    solve(n)(a => {
        if(a.length == m){
            // all.push(...permute(a));
            diffPush(all, permute(a));
        }
    });
    console.log('有序拆分结果--', all, '--有序拆分结果');
    return all;
}

运行结果:


有序拆分-算法结果.png

相关文章

  • 正整数n的有序m拆分-实现方法

    需求:输入一个正整数n,拆分成m份有多少种情况,输出,不同的顺序算不同的情况,即有序实现方法: 运行结果:

  • 欧几里得算法

    题目:给定两个正整数m 、n,求它们的最大公因数(即同时整除m、n的最大正整数) 思路如下: 1、(求余数)用 m...

  • 实验九:优秀代码

    B : 求m到n之间的素数和----函数 题目描述输入两个正整数m和n(m

  • 动态规划:343.整数拆分, 53.最大子序和

    /** 343.整数拆分 题目 给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回...

  • 编程题(2)

    现给定任意正整数 n,请寻找并输出最小的正整数 m(m>9),使得 m 的各位(个位、十位、百位 ... ...)...

  • 分治法

    整数划分 所谓整数划分,是指把一个正整数n写成如下形式:n=m1+m2+...+mi; (其中mi为正整数,并且1...

  • 散列

    散列的定义与整数散列 问题提出:给出 N 个正整数,再给出 M 个正整数,问这 M 个数中的每个数分别是否在 N ...

  • 面试题14-(剪绳子)动态规划&贪心算法

    题目要求 题目要求: 给你一根长度为n的绳子,请把绳子剪成m段(m , n )都是正整数,(n>1&m>1) 每段...

  • 2019-11-13

    8.原根 引理1:设(a,m)=1,则(i)存在正整数n,1n

  • 辗转相除法——字符串处理

    辗转相除法 GCD:辗转相除法,求两个正整数的最大公约数。 gcd(m,n) = gcd(n,m mod n) [...

网友评论

      本文标题:正整数n的有序m拆分-实现方法

      本文链接:https://www.haomeiwen.com/subject/jnzotqtx.html