Python动态规划背包问题 暴力搜索与动态规划一维数组 时间对比

from typing import (
    List,
)
import time

def weight_capacity(weights: List[int], max_capacity: int) -> int:       
        for b in weights:
            if b>max_capacity:
                weights.remove(b)

        n=len(weights)
        a=[0]*n
        boo=True
        c=0
        while boo:
            i = 0
            bJW = True           
            while i<n and bJW:  #进位加法器
                if a[i] == 0 :
                    a[i]= 1
                    bJW = False
                else:
                    a[i] = 0
                    bJW = True
                i+=1

            boo=False
            maxWt=0
            i=0
            while i<n :
                if a[i]==1:                      
                    if maxWt<max_capacity:
                        maxWt+=weights[i]                 
                else:
                    boo=True                   
                i+=1

            if maxWt>c and maxWt<=max_capacity:
                c=maxWt

        return c

def weightNPC(weights:List[int],max_capacity:int)->int:
        for a in weights:
            if a >max_capacity :
                weights.remove(a)

        n=len(weights)
        dp=[0]*max_capacity
        for i in range(n):
            j=max_capacity-1
            while j>=weights[i]:
                dp[j]=max(dp[j],dp[j-weights[i]]+weights[i])
                j=j-1

        return dp[max_capacity-1]
    
print("Starting...")
time1=time.time()
#w=[67356,233900,982590,372879,415998,461941,98935,239287,433413,36109,887779,857424,928267,49000,321030,230551,332083,580018,932293,851765,688961,989160,222830,425340,21042,386203,878017,246204,194031,837181,87247,909684,26518,908975,361664,213872,744761,278193,434280,60833]
#r=237733
w=[393475,160580,732972,534138,693123,968128,568316,960203,816302,222601,914770,107641,419535,844112,262804,404124,599548,977638,693620,571373,75218,512746,876939,88477,455114,395077,784405,876985,724954,414721,963000,627072,767523,526531,112644,325038,6571,842459,884845,13454,160268,748438,53640]
r=1000000
#w=[1,3,5,7]
#r=15
#print(weight_capacity(w,r))
print(weightNPC(w,r))
time2=time.time()
print("Oooooooooook!总共费时s:",time2-time1,"秒")    

第一组数据的结果是236478,第二组数据结果 999988,第一组数据采用动态规划(一维数组)耗时1.4秒,采用暴力搜索方法,耗时103.8秒。网上多是java或C++算法,本文重点在于测试数据、暴力搜索与动态规划算法(模拟二进制进位的方法形成2^n-1种组合)的对比。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值