子集和问题 及 c++ 代码实现

本文介绍了如何运用动态规划解决子集和问题,将其转化为01背包问题。通过构建决策树,设定解向量并利用递归进行左儿子和右儿子的选择,最终给出C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   首先声明:子集和问题可以用动态规划问题解决,即01背包问题的解法即可。在这里我们采用下构造树的问题。

问题:

      给定n个正整数{ wi|i=0...n}和一个正整数m,在这n个正整数中找出一个子集,使得子集中的正整数之和等于m。

 

解的形式:

      设定一个n元组(x0,x1,...xn-1),如果wi包含在这个子集中,x是解向量,xi就等于1,反之等于0.

X数组是解向量,t=∑(1,..,k-1)Wi*Xi, r=∑(k,..,n)Wi    (说明:t就是前k-1个数选择之后的和,r表示剩余n-k+1个数的和
若t+Wk+W(k+1)<=M,则Xk=true,递归左儿子(X1,X2,..,X(k-1),1);否则剪枝;
若t+r-Wk>=M && t+W(k+1)<=M,则置Xk=0,递归右儿子(X1,X2,..,X(k-1),0);否则剪枝;
本题中W数组就是(1,2,..,n),所以直接用k代替WK值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值