回溯法---->子集和数问题

子集和数问题

问题描述

已知(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)

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

posted on   小强斋太  阅读(941)  评论(0编辑  收藏  举报

编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律

导航

< 2013年5月 >
28 29 30 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 1
2 3 4 5 6 7 8
点击右上角即可分享
微信分享提示