子集和问题
代码
def MaxAdd(n,c,value,bestx):
i=1
x=[0 for i in range(n+1)]
bestw=0
cw=0
r=0
for j in range(1,n+1):
r+=value[j]
print("r",r)
while True:
while i<=n and cw+value[i]<=c:
r-=value[i]
cw+=value[i]
x[i]=1
i+=1
print("第{}层".format(i-1))
print("←添加",value[i-1])
print("cw",cw)
print("r",r)
if i>n:
print("第{}层".format(i))
print("到达左叶子")
for j in range(1,n+1):
bestx[j]=x[j]
bestw=cw
else:
r-=value[i]
i+=1
print("向右,不加",value[i-1])
print("r",r)
print("到第{}层".format(i))
while cw+r<=bestw:
i-=1
print("回退到",value[i])
print("第{}层".format(i))
print("cw",cw)
print("r",r)
while i>0 and (not x[i]):
r+=value[i]
i-=1
print("一直回退到",value[i])
if i==0:
return bestw,bestx
x[i]=0
cw-=value[i]
i+=1
n=5
c=10
value=[0,4,5,6,2,2]
bestx=[0 for i in range(n+1)]
r=0
for j in range(1,n+1):
r+=value[j]
bestw,bestx=MaxAdd(n,c,value,bestx)
print("最大子集和为",bestw)
print("构成最大子集和的子集为:",end="")
for i in range(n+1):
if bestx[i]:
print(value[i],end=" ")
结果
最小元素个数子集和问题
代码
def MaxAdd(n,c,value,bestx):
i=1
number=100
x=[0 for i in range(n+1)]
bestw=0
cw=0
r=0
for j in range(1,n+1):
r+=value[j]
while True:
while i<=n and cw+value[i]<=c and x.count(1)+1<=number:
r-=value[i]
cw+=value[i]
x[i]=1
i+=1
print("第{}层".format(i-1))
print("←添加",value[i-1])
print("cw",cw)
print("r",r)
print()
if i<=n and (cw+value[i]>c or x.count(1)+1>number):
r-=value[i]
i+=1
print("向右,不加",value[i-1])
print("r",r)
print("cw",cw)
print("到第{}层".format(i))
print()
while cw+r<bestw or r==0:
if cw>=bestw:
print("第{}层".format(i))
print("到达叶子")
for j in range(1,n+1):
bestx[j]=x[j]
number=bestx.count(1)
print("元素个数number",number)
bestw=cw
print("最大子集和bestw",bestw)
print()
i-=1
print("回退到",value[i])
print("第{}层".format(i))
print("cw",cw)
print("r",r)
while i>0 and (not x[i]):
r+=value[i]
i-=1
print("一直回退到",value[i])
if i==0:
return bestw,bestx,number
x[i]=0
cw-=value[i]
i+=1
print("cw",cw)
print("r",r)
print()
c=10
value=[0,2,2,6,5,4]
n=len(value)-1
bestx=[0 for i in range(n+1)]
bestw,bestx,number=MaxAdd(n,c,value,bestx)
print("最大子集和为",bestw)
print("构成最大子集和的子集元素个数为",number)
print("构成最大子集和的子集为:",end="")
for i in range(n+1):
if bestx[i]:
print(value[i],end=" ")
结果