码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2019-12-07 12:28:09      阅读:90      评论:0      收藏:0      [点我收藏+]

标签:eve   back   test   als   数组   ++   diff   else   mon   

 

/**
 * 尝试获取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

标签:eve   back   test   als   数组   ++   diff   else   mon   

原文地址:https://www.cnblogs.com/zhuwansu/p/12001037.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!