子集和问题:
集合s是一个有n个正整数构成的集合{w1,w2,……,wn},指定正整数c,判断正整数c,判断是否存在S的一个子集S1,使得w∈S1,∑w=c;
若子集和问题有解,则输出子集S1的元素;
1.说明:
设n个元素(正整数)存储在w数组中,应用动态规划设计求解;
目标函数: max(n)∑(i=1)xi wi
约束条件: (n)∑(i=1)xi wi<=c(xi∈{0,1},c,wi∈N*,i=1,2,……,n)
按构建S1选择每一个元素为一个阶段,共分为n个阶段;
(1)、建立递推关系;
设m(i,j)为集合S1距离c还差j,可取整数编号范围为:i,i+1,……,n的最大和,则:
当0<=j< w(i)时,整数w(i)不可选,m(i,j)与m(i+1,j)相同;
当j>=w(i)时,有两种选择:不选择整数w(i),这时最大值为m(i+1,j);选择整数w(i),这时已增加整数w(i),剩余差额为j-w(i),可以选择整数编号范围为i+1,……,n,最大值为m(i+1,j-w(i))+w(i);
我们期望的最大值是两者中的最大值,于是有递推关系:
| m(i+1,j) 0<=j<w(i)
m(i,j)=
| max(m(i+1,j),m(i+1,j-w(i))+w(i)) j>=w(i)
以上j与w(i)均为正整数,i=1,2,……,n,所求最优值为m(1,c);
(2)、递推计算最优值;
for(j=0;j<=c