算法分析与设计:python解决两船载货问题(本质:回朔法解决01背包问题)

1.已知X、Y两船的限重6吨和4吨,岸上对应有重为1,4,4,2,3吨的A、B、C、D、E五钟货物,它们的价值分别为1,2,3,5,3万元 ,两船如何分配才能让此次运送货物的价值最大?

weight=[1,4,4,2,3]
value=[1,2,3,5,3]
op=[0]*len(weight)
Limit_weight_X=6
MAX_value_X=0
X_load_weight=0

op1=[]
weight1=[]
value1=[] 
Limit_weight_Y=4
MAX_value_Y=0        
Y_load_weight=0


def boatX(i,weight_X,value_X):
    global op
    global op1
    global MAX_value_X
    global X_load_weight
     
    if i==len(op):
        if value_X>MAX_value_X :  
            MAX_value_X=value_X
            X_load_weight=weight_X
            for i in range(len(op)):
                x_op[i]=op[i]
    else:
        if weight_X+weight[i]<=Limit_weight_X:
            op[i]=1
            boatX(i+1,weight_X+weight[i],value_X+value[i])
            
        op[i]=0
        boatX(i+1,weight_X,value_X)        
  


def boatY(i,weight_Y,value_Y):
    global op1
    global op2
    global MAX_value_Y
    global Y_load_weight
     
    if i==len(op1):
        if value_Y>MAX_value_Y :  
            MAX_value_Y=value_Y
            Y_load_weight=weight_Y
            for i in range(len(op1)):
                y_op[i]=op1[i]
    else:
        if weight_Y+weight1[i]<=Limit_weight_Y:
            op1[i]=1
            boatY(i+1,weight_Y+weight1[i],value_Y+value1[i])
            
        op1[i]=0
        boatY(i+1,weight_Y,value_Y) 
               


   
#1.X船装货物----------------------------------------
x_op=[0]*len(weight)
boatX(0,0,0)
print("1.X船装货情况:",x_op,",载重:",X_load_weight,",装载价值:",MAX_value_X)


#2.清理剩余货物-----------------------------------------------------
for i in range(len(x_op)):
    if x_op[i]==0:
        op1.append(x_op[i])
        weight1.append(weight[i])
        value1.append(value[i])
print("2.剩余货物:",op1,",重量:",weight1,",对应价值:",value1)    



#3.Y船装货物------------------------------------------------------------------------   
y_op=[0]*len(op1)
boatY(0,0,0)    
print("3.Y船装货情况:",y_op,",载重:",Y_load_weight,",装载价值:",MAX_value_Y)

#4.求和-------------------------------------------------------------
print("4.X、Y两船装载货物最大价值:",MAX_value_Y+MAX_value_X)

2.回朔法解决01背包问题01背包问题

weight=[5,3,2,1,4,4,2]
value=[4,4,3,1,2,3,5]
max_number=4
op=[0]*len(weight)

weight_X=0
value_X=0

max_weight=6
max_value=0
op_weight=0
max_op=[1,1,1,1,1,1,1]

def fun(i,weight_X,value_X):
    global op
    global max_value
    global op_weight
     
    if i==len(op):
        print("购买商品状况",op,"总重量为",weight_X,"当前的价值为",value_X)
        if value_X>max_value:
            max_value=value_X
            op_weight=weight_X
            for i in range(len(op)):
                max_op[i]=op[i]
                            
    else:
        if weight_X+weight[i]<=max_weight:
            op[i]=1
            fun(i+1,weight_X+weight[i],value_X+value[i])
             
        op[i]=0
        fun(i+1,weight_X,value_X)        

fun(0,0,0)
print("最终购买商品状况",max_op,"总重量为",op_weight,"最大的价值为",max_value)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值