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

贪心算法-背包难题

丌官嘉福
2023-03-14

我试图用Python 3.x中的贪婪算法解决背包问题。下面是我的代码,以及我用来测试它的示例案例。每个示例案例的形式为行[0]=最大权重,行[1:]的形式为(权重,值。)

成功案例1:

575
125 3000
50 100
500 6000
25 30
1500
151 150
150 150
def take_input(infile):
    f_open = open(infile, 'r')
    lines = []
    for line in f_open:
        lines.append(line.strip())
    f_open.close()
    return lines

def create_list(jewel_lines):
    #turns the jewels into a list of lists
    jewels_list = []
    for x in jewel_lines:
        weight = x.split()[0]
        value = x.split()[1]
        jewels_list.append((int(value), int(weight)))
    jewels_list = sorted(jewels_list, reverse=True)
    return jewels_list

def greedy_grab(jewels_list, max_weight):
    running = 0
    i = 0
    grabbed_list = []
    string = ''
    total_haul = 0
    #sort jewels list by value, since this is greedy

    while running <= max_weight and i <= (len(jewels_list)-1):
        #pick the most valuable item
        to_add = int(jewels_list[i][1])
        if (running + to_add) > max_weight:
            i += 1
        else:
            running += to_add
            grabbed_list.append(jewels_list[i][0])
    for item in grabbed_list:
        total_haul += int(item)
    string = "The greedy approach would steal $" + str(total_haul) + " of jewels." +"It would use value " + str(grabbed_list)
    return string

#required setup of variables    
infile = "JT_test3.txt"
given_input = take_input(infile)
max_weight = int(given_input[0])
given_input.pop(0)
jewels_list = create_list(given_input)

#test lines
print(jewels_list)
print(greedy_grab(jewels_list, max_weight))

上一次我在重写程序之前出现这样的错误,是在与int类型进行斗争。这一次似乎是在断绝关系,但我不确定如何修复它。非常感谢任何帮助。我只知道当我看到它的时候这会是一个简单的解决方案...

编辑:这必须与我的列表如何排序有关。我有一个列表,逆向排序。但是,如果项[0]和项2[0]之间存在关联,则需要按项[1]进行排序。但我不知道怎么做。

共有1个答案

闻梓
2023-03-14

在第二种情况下,sorted(jewels_list,reverse=true)返回[(150,151),(150,150)],因此algoritm在相等的宝石中选择最重的宝石。你应该按值降序排序,按权重升序排序,以得到你所期望的。

 类似资料:
  • 任务是典型的背包问题。求解时应采用贪婪算法。我设法创建了下面的代码,但它工作得太慢了。你能告诉我怎么加快速度吗?谢谢你。 c是背包的重量限制。n表示价格权重对的数量(这两个数字都是int类型,而不是float)。限制如下:(1)如果在相同重量的元素之间选择,价格最高的元素应该被取;(2)如果在相同价格和相同重量的元素之间选择,第一个输入的元素应该被取。

  • 主要内容:贪心算法的实际应用《 算法是什么》一节讲到,算法规定了解决问题的具体步骤,即先做什么、再做什么、最后做什么。贪心算法是所有算法中最简单,最易实现的算法,该算法之所以“贪心”,是因为算法中的每一步都追求最优的解决方案。 举个例子,假设有 1、2、5、10 这 4 种面值的纸币,要求在不限制各种纸币使用数量的情况下,用尽可能少的纸币拼凑出的总面值为 18。贪心算法的解决方案如下: 率先选择一张面值为 10 的纸币,可以

  • 本文向大家介绍Python基于贪心算法解决背包问题示例,包括了Python基于贪心算法解决背包问题示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python基于贪心算法解决背包问题。分享给大家供大家参考,具体如下: 贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。 贪心算法不是对所有

  • 本文向大家介绍JS基于贪心算法解决背包问题示例,包括了JS基于贪心算法解决背包问题示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JS基于贪心算法解决背包问题。分享给大家供大家参考,具体如下: 贪心算法:在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。 寻找最优解的过程,目的是得到当前最优解 部分背包问题:固定容

  • 我试图用Python解决背包问题,实现一个贪婪的算法。我得到的结果对我来说毫无意义。 背包: 结果:

  • 本文向大家介绍python 贪心算法的实现,包括了python 贪心算法的实现的使用技巧和注意事项,需要的朋友参考一下 贪心算法 贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。 贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不