Algorithm 改进的0-1背包

Algorithm 改进的0-1背包,algorithm,knapsack-problem,Algorithm,Knapsack Problem,有一些项目排成一行,重复,每种都有一定的成本。你身上有x个数量。您还可以自由地将一种商品的价格设置为0。但我们只能选择连续的项目(不能跳过)。你最多可以挑选的物品是什么?abacdab,成本(a:1,b:2,c:1,d:5),x=6,所以你能找到的大多数文章都是6(abacda,设置成本d=0)。 我的方法是:从abacdab开始,从右边减少一个字母,并在将字母的最大成本(count*cost)设置为0后检查成本,在第一个子字符串满足时停止,并将长度记为lmax。 现在用bacda重复上述步骤(

有一些项目排成一行,重复,每种都有一定的成本。你身上有x个数量。您还可以自由地将一种商品的价格设置为0。但我们只能选择连续的项目(不能跳过)。你最多可以挑选的物品是什么?abacdab,成本(a:1,b:2,c:1,d:5),x=6,所以你能找到的大多数文章都是6(abacda,设置成本d=0)。 我的方法是:从abacdab开始,从右边减少一个字母,并在将字母的最大成本(count*cost)设置为0后检查成本,在第一个子字符串满足时停止,并将长度记为lmax。 现在用bacda重复上述步骤(删除第一个字母),但在长度==lmax的子字符串处停止。 有没有一种更快的方法可以用动态规划解决这个问题?

我的方法:

cot={'a':1,'b':2,'c':1,'d':5}
def maxarticles(s,cot,x):
    l=len(s)
    lmax=0
    smax=''
    cmax=0
    for i in range(l):
        if i+lmax==l:
            break
        for j in range(l,i+lmax,-1):
            subarr=s[i:j]
            c=cost(subarr,cot)
            print(subarr,c)
            le=j-i
            if c<=x:
                if lmax<le:
                    smax=subarr
                    lmax=le
                    cmax=c
                    print(subarr,c,lmax)
                    break
return smax,lmax,cmax

def cost(s,cot):
    counts={}
    m=0
    total=0
    for i in s:
        val=cot[i]
        if i in counts:
            counts[i]+=val
        else:
            counts[i]=val
        if counts[i]>m:
            m=counts[i]
        total+=val
    return total-m
cot={'a':1,'b':2,'c':1,'d':5}
def maxarticles(s、cot、x):
l=len(s)
lmax=0
smax=''
cmax=0
对于范围(l)中的i:
如果i+lmax==l:
打破
对于范围(l,i+lmax,-1)内的j:
subar=s[i:j]
c=成本(斯巴鲁、科特)
打印(Subar,c)
le=j-i
如果c