当前位置: 首页 > 知识库问答 >
问题:

背包:从列表中添加项目(Python)

周墨一
2023-03-14

我在写一个背包问题的代码。有一个有重量容量的背包,你选择一个特定的项目组合,以找到最好的解决方案。我试图随机生成可能的解决方案。因此,我的代码将选择随机数量的随机项(生成一个随机大小的列表),并测试解决方案是否可行(小于容量)或不可行(大于容量)。然而,当我试图把所有物品的总重量和总价值相加时,这个数字是关闭的。比如说,这是每一项的数据

Itms    Wts     Vals   
=====================
1       22      80
2       29      35
3       12      36
4       14      24
5       29      41
6       30      87
7       18      10
8       22      63
9       12      66

10 27 72

Items picked:  [6, 4, 1, 7, 8, 3]
Feasible:  Total Wt =  18 Total Val =  10
Items picked:  [1]
Infeasible:  Total Wt =  135 Total Val =  264
Items picked:  [5, 1, 8, 6, 7, 4]
Infeasible:  Total Wt =  89 Total Val =  198

所以值是不正确的。但我看不出我的代码有什么问题:

def genSoln(cap,items):
    g = input("Would you like to generate random potential solutions? [y/n] ")
    if g == 'y':
        gen = int(input("Number of times to generate/check random potential solutions? "))
        totalwt = 0
        totalval = 0
        for i in range(1,gen+1):
            pop = range(1,items)
            leng = random.randint(1,len(pop))
            ran = random.sample(pop, leng)
            for i in ran:
                totalwt += int(wts[i])
                totalval += int(vals[i])
                if i == len(ran):
                    if totalwt < int(cap):
                        print("Items picked: ", ran)
                        print("Feasible: ", "Total Wt = ", totalwt, "Total Val = ", totalval)
                    else:
                        print("Items picked: ", ran)
                        print("Infeasible: ", "Total Wt = ", totalwt, "Total Val = ", totalval)
                    totalwt = 0
                    totalval = 0

共有1个答案

程化
2023-03-14

不要紧。我自己想出了答案。我只需要取出,如果I==len(ran):,将totalwttotalval移动到for循环中(for I在范围(1,gen+1)),并在添加到totalwttotalval时从I中减去1。

def genSoln(cap,items):
    g = input("Would you like to generate random potential solutions? [y/n] ")
    if g == 'y':
        gen = int(input("Number of times to generate/check random potential solutions? "))
        for i in range(1,gen+1):
            totalwt = 0
            totalval = 0
            pop = range(1,items)
            leng = random.randint(1,len(pop))
            ran = random.sample(pop, leng)
            for i in ran:
                totalwt += int(wts[i-1])
                totalval += int(vals[i-1])
            if totalwt < int(cap):
                print("Items picked: ", ran)
                print("Feasible: ", "Total Wt = ", totalwt, "Total Val = ", totalval)
            else:
                print("Items picked: ", ran)
                print("Infeasible: ", "Total Wt = ", totalwt, "Total Val = ", totalval)
 类似资料:
  • 我的目标是从用户输入的“AM”-“PM”字符串格式打印包含24小时十进制格式的进入和退出时间的列表,如以下字符串数组:{6AM#8AM,11AM#1PM,7AM#8PM,7AM#8AM,10AM#12PM,12PM#4PM,1PM#4PM,8AM#9AM} 我在for循环中声明了各个列表,并在循环中为它们赋值,但从代码中得到了以下运行时异常:java。lang.IndexOutOfBoundsEx

  • 本文向大家介绍向Bootstrap列表组中的活动列表项添加背景色,包括了向Bootstrap列表组中的活动列表项添加背景色的使用技巧和注意事项,需要的朋友参考一下 使用.active类将灰色背景色添加到Bootstrap列表组中的活动列表项中。 您可以尝试运行以下代码将背景色添加到活动列表项中- 示例

  • 所以我想拿一个这样的清单: <代码>[1,2,3,4] 然后在位置“i”前添加一个项目。例如,如果i=2,列表将变为: 我怎么能用蟒蛇做呢?先谢谢你。

  • 我有一个输入字段,它使用的是。下面的确实返回了我的列表 该列表以代码隐藏方式生成,如下所示 我的观点 但是当我运行代码时,我得到了以下错误 \n\nSCRIPT1004:预期; 下面是它返回的一些结果:$(函数(){var list=list[2103]; 注意:所有粗体的措辞都是我的清单失败的地方。 我试着做

  • 本文向大家介绍sharepoint项目。从列表中检索项目,包括了sharepoint项目。从列表中检索项目的使用技巧和注意事项,需要的朋友参考一下 示例            

  • 本文向大家介绍Visual Basic .NET将项目添加到列表,包括了Visual Basic .NET将项目添加到列表的使用技巧和注意事项,需要的朋友参考一下 示例 要一次添加多个项目,请使用AddRange。始终添加到列表的末尾 为了将项目添加到列表的中间,请使用插入 插入将把该项目放置在索引处,并对其余项目重新编号 新输出: