zoukankan      html  css  js  c++  java
  • 回溯法>子集和数问题

    子集和数问题

    问题描述

    已知(w1, w2, …, wn)和M,均为正数。要求找出wi的和数等于M的所有子集。

      例如:若n=4,(w1,w2,w3,w4)=(11,13,24,7),M=31,则满足要求的子集是(11,13,7)和(24,7).

    分析

    子集和数问题解的一种表示方法

    • 解由n-元组(x1, x2, …, xn)表示;
    • 显式约束条件xi∈{0,1} ,1≤i≤n,如果没有选择Wi,则xi=0;如果选择了Wi,则xi=1。于是上面的解可以表示为(1,1,0,1)和(0,0,1,1);
    • 隐式约束条件(xi× wi)的和数为M
    • 解空间的大小为2n个元组

    子集和数的递归回溯算法

    //找W(1:n)中和数为M的所有子集。进入此过程时X(1),…,X(k-1)的值已确定。W(j)按非降次序排列。

    global integer M,n; global real W(1:n); global boolean X(1:n)

    real  r,s; integer k,j

         //生成左儿子//

       X(k)←1

       if s+W(k)=M then

         print(X(j),j←1 to k)

       else

         if s+W(k)+W(k+1)<=M then

            call SUMOFSUB(S+W(k),k+1,r-W(k))

        endif

     endif

         //生成右儿子和计算Bk的值//

     if   s+r-W(k)>=M and s+W(k+1)<=M

     then X(k)←0

              call SUMOFSUB(s,k+1,r-W(k))

     endif

    end SUMOFSUB

    例子

    n=6, M=30,W(1:6)=(5,10,12,13,15,18)

    (当前和,当前处理的子数,剩余子数的和)

  • 相关阅读:
    专职DBA-MySQL体系结构与基本管理
    JSON
    MIME类型
    文件上传下载
    response常用的方法
    2020.11.27小记
    HTTP请求状态码
    1561. Maximum Number of Coins You Can Get
    1558. Minimum Numbers of Function Calls to Make Target Array
    1557. Minimum Number of Vertices to Reach All Nodes
  • 原文地址:https://www.cnblogs.com/xqzt/p/5637088.html
Copyright © 2011-2022 走看看