从数组中取出n个不同的数组成子集 y 使 x = Σy

Posted zhuwansu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从数组中取出n个不同的数组成子集 y 使 x = Σy相关的知识,希望对你有一定的参考价值。

 

/**
 * 尝试获取arr子集 y  使 x=Σy
 * @param {Array} arr 
 * @param {number} x 
 * @param {Array} res 
 */
function tryVisit(arrxres) {
   res = res || arr.map(m => { return { x: x - mitem: [m] } });

   for (let ri = 0ri < res.lengthri++) {
      const rr = res[ri];
      let toDel = true;
      for (let i = 0i < arr.lengthi++) {
         const item = arr[i];

         if (contains(rr.itemitem)) continue;

         let diff = rr.x - item;

         if (diff < 0) { }
         else if (diff > 0) {
            rr.item.push(item)
            rr.x = diff;
         }
         else {
            rr.item.push(item);
            console.log(rr.item.join(‘,‘))
            return rr.item;
         }
         toDel = false;
      }
      if (toDelres[ri] = undefined;
      else res[ri] = rr;

   }

   let toVisit = res.filter(m => m != undefined);
   if (toVisit.length != 0tryVisit(arr0toVisit)
}

/**
 * arr 中是否包含 tag
 * @param {Array} arr 
 * @param {*} tag 
 */
function contains(arrtag) {
   for (let j = 0j < arr.lengthj++) {
      const r = arr[j];
      if (r == tag) {
         return true;
      }
   }
}
function main() {

   let tag = [123461099232230];
   let v = 101;

   //test
   console.log(‘test:每种方法都测试一下‘);
   tryVisit(tagv) && tryVisit(tag.reverse(), v) && tryVisit(tag.sort((m,n=> m-n), v) && tryVisit(tag.sort((m,n=> n-m), v);
   //正序倒序、乱序、默认排序 等 多种尝试 比如 如果目标数是偶数 就按照奇数偶数排序试一下
   console.log(‘use:只取一个‘);
   tag = [123461099232230];
   let res = tryVisit(tagv) || tryVisit(tag.reverse(), v) || tryVisit(tag.sort((m,n=> m-n), v) || tryVisit(tag.sort((m,n=> n-m), v);
}

main();

理论上尝试次数越多函数失效的可能性越少,我列出了 排序不排序和他们的反转情况

 

 技术图片

 

/**
 * 尝试获取arr子集 y  使 x=Σy
 * @param {Array} arr 
 * @param {number} x 
 * @param {Array} res 
 */
function tryVisit(arrxres) {
   res = res || arr.map(m => { return { x: x - mitem: [m] } });

   for (let ri = 0ri < res.lengthri++) {
      const rr = res[ri];
      let toDel = true;
      for (let i = 0i < arr.lengthi++) {
         const item = arr[i];

         if (contains(rr.itemitem)) continue;

         let diff = rr.x - item;

         if (diff < 0) { }
         else if (diff > 0) {
            rr.item.push(item)
            rr.x = diff;
         }
         else {
            rr.item.push(item);
            console.log(rr.item.join(‘,‘))
            return rr.item;
         }
         toDel = false;
      }
      if (toDelres[ri] = undefined;
      else res[ri] = rr;

   }

   let toVisit = res.filter(m => m != undefined);
   if (toVisit.length != 0tryVisit(arr0toVisit)
}

/**
 * arr 中是否包含 tag
 * @param {Array} arr 
 * @param {*} tag 
 */
function contains(arrtag) {
   for (let j = 0j < arr.lengthj++) {
      const r = arr[j];
      if (r == tag) {
         return true;
      }
   }
}
function main() {

   let tag = [123461099232230];
   let v = 101;

   //test
   console.log(‘test:每种方法都测试一下‘);
   tryVisit(tagv) && tryVisit(tag.reverse(), v) && tryVisit(tag.sort((m,n=> m-n), v) && tryVisit(tag.sort((m,n=> n-m), v);
   //正序倒序、乱序、默认排序 等 多种尝试 比如 如果目标数是偶数 就按照奇数偶数排序试一下
   console.log(‘use:只取一个‘);
   tag = [123461099232230];
   let res = tryVisit(tagv) || tryVisit(tag.reverse(), v) || tryVisit(tag.sort((m,n=> m-n), v) || tryVisit(tag.sort((m,n=> n-m), v);
}

main();

以上是关于从数组中取出n个不同的数组成子集 y 使 x = Σy的主要内容,如果未能解决你的问题,请参考以下文章

互斥的数(codevs 1553)

codevs1553 互斥的数

codevs——1553 互斥的数

互斥的数(codevs1553)

codevs1553 互斥的数

C语言程序:从N个数中随机取出100个不同的数