背包||硬币||组队-python求解

1.寻找硬币(组合最小):
硬币找零1硬币找零2硬币找零3

#动态规划描述就是:初始状态就是有d[i]=j表示i元至少需要j个硬币找零,
#d[0]=0,d[1]=d[1-1]+1=1,d[2]=min(d[2-1]+1,d[2-2]+1)=1;
#即硬币的组合为c[b,k,m,....,n],如果i>=c[nn],
#d[i]=min(d[i],d[i-b]+1,d[i-k]+1,...,d[i-nn]+1)
#即代转移状态方程为d[i]=min(d[i],d[i-c[kk]]),kk=0,1,...,nn,d[i]初始设置为inf
# import math
# def findCoins(money,coins):#自底向上寻找#递推
#     dp=[math.inf]*(money+1)
#     coins.sort()
#     dp[0]=0#
#     for i in range(money+1):
#         for j in coins:
#             if i>=j:
#                 dp[i]=min(dp[i],dp[i-j]+1)
#     return dp
# print(findCoins(27,[3,2,5]))

#暴力求解就是:
SS=[]
for i in range(27//2):
    for j in range(27//3):
        for k in range(27//5):
            if 2*k+3*j+5*k==27:
               SS.append(i+j+k)
print(min(SS))

2.背包问题:

#暴力求解#
import itertools
# weight=10
# W=[3,4,5]
# V=[4,5,6]
# AA=[]
# VAL=[]#价值和
# for i in range(len(W)+1):
#     for num in itertools.combinations(W,i):
#         if sum(num)<=10:
#             AA.append(num)
#             ss=0
#             for j in num:
#                 ss+=V[W.index(j)]
#             VAL.append(ss)
# print(AA)
# print(VAL)
# print(max(VAL))

#动态规划#背包问题
'''找状态:d[i,j]表示当前背包重量为j时是否选择第i个商品的最大价值。
和转移状态:1)d[i,j]=d[i-1,j]表示第j个商品不放入背包中
2)d[i,j]=d[i-1,j-w[i]]+v[i]表示第j个商品放入背包中
两者结合求最大,即d[i,j]=max(d[i-1,j],d[i-1,j-w[i]]+v[i])'''
# def bag(W,V,weight):
#     dp=[[0]*(weight+1) for i in range(len(V)+1)]
#     for i in range(len(V)+1):
#         for j in range(weight+1):
#             if i==0 or j==0:
#                 dp[i][j]=0
#             elif j>=W[i-1]:
#                 dp[i][j]=max(dp[i-1][j-W[i-1]]+V[i-1],dp[i-1][j])
#             else:
#                 dp[i][j]=dp[i-1][j]
#     return dp
# if __name__=='__main__':
#     weight=10
#     W=[3,4,5]
#     V=[4,5,6]
#     print(bag(W,V,weight))

#回溯法解背包问题
W=[10,8,5]#重量
V=[5,4,1]#价值
X=[0,0,0]#背包当前的价值
N=3#物品的数量
C=16#背包的容量
CurWeight=0#每个物品的重量
CurValue=0 #每个物品的价值
BestValue=0 #x[i]=1代表物品i放入背包,0代表不放入
BestX=[0]*N

def backtrack(t):
    global BestValue
    global CurValue
    global CurWeight
    if t>N-1:#叶子节点,输出结果#结束条件
        if CurValue>BestValue:#如果找到一个更优解
            BestValue=CurValue#保存更优解和值
            for i in range(N):
                BestX[i]=X[i]
    else:
        for j in range(2):#判断准则
            X[t]=j
            if j==0:#不放入背包
                backtrack(t+1)
            else:
                if CurValue+W[t]<=C:
                    CurValue+=W[t]
                    CurValue+=V[t]
                    backtrack(t+1)
                    CurWeight-=W[t]
                    CurValue-=V[t]

if __name__=='__main__':
    backtrack(0)
    print(CurValue)
    print(BestX)

3.组队:

#回溯算法#组队#一个岗位只需要一人,一人只能胜任一个岗位
data='''97 90 0 0 0
92 85 96 0 0
0 0 0 0 93
0 0 0 80 86
89 83 97 0 0
82 86 0 0 0
0 0 0 87 90
0 97 96 0 0
0 0 89 0 0
95 99 0 0 0
0 0 96 97 0
0 0 0 93 98
94 91 0 0 0
0 83 87 0 0
0 0 98 97 98
0 0 0 93 86
98 83 99 98 81
93 87 92 96 98
0 0 0 89 92
0 99 96 95 81
'''.split()
data=list(map(int,data))
dd=[]
for i in range(len(data)//5):
  dd.append(data[i*5:(i+1)*5])
def Com(X,Y,dui):
    if len(dui)==5:#结束条件
        res.append(sum(dui))#结果添加
        return
    for i in range(20):
        for j in range(5):#可选选择
            if (i not in X) and (j not in Y):
                X.append(i)
                Y.append(j)
                dui.append(dd[i][j])
                Com(X,Y,dui)
                X.pop()
                Y.pop()
                dui.pop()
if __name__=='__main__':
    res=[]
    import time
    ss=time.time()
    Com([],[],[])
    end=time.time()
    print(len(res))
    print(max(res))
    print('时间:%f' %(end-ss))

结果为:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值