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

Python贪婪算法

戚繁
2023-03-14
10
3 4
2 3
1 1
575
125 3000
50 100
500 6000
25 30
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 set_weight(weight):
    bag_weight = weight
    return bag_weight

def jewel_list(lines):
    jewels = []
    for item in lines:
        jewels.append(item.split())
    jewels = sorted(jewels, reverse= True)
    jewel_dict = {}
    for item in jewels:
        jewel_dict[item[1]] = item[0]
    return jewel_dict

def greedy_grab(weight_max, jewels):
    #first, we get a list of values
    values = []
    weights = []
    for keys in jewels:
        weights.append(jewels[keys])
    for item in jewels.keys():
        values.append(item)
    values = sorted(values, reverse= True)
    #then, we start working
    max = int(weight_max)
    running = 0
    i = 0
    grabbed_list = []
    string = ''
    total_haul = 0
    # pick the most valuable item first. Pick as many of them as you can.            
    # Then, the next, all the way through.
    while running < max:
        next_add = int(jewels[values[i]])
        if (running + next_add) > max:
            i += 1
        else:
            running += next_add
            grabbed_list.append(values[i])
    for item in grabbed_list:
        total_haul += int(item)
    string = "The greedy approach would steal $" + str(total_haul) + " of  
             jewels."
    return string

infile = "JT_test2.txt"
lines = take_input(infile)
#set the bag weight with the first line from the input
bag_max = set_weight(lines[0])
#once we set bag weight, we don't need it anymore
lines.pop(0)

#generate a list of jewels in a dictionary by weight, value
value_list = jewel_list(lines)
#run the greedy approach
print(greedy_grab(bag_max, value_list))

有人有线索为什么它对案件2不起作用吗?非常感谢你的帮助。编辑:案例2的预期结果是6130美元。我好像得到了6090美元。

共有1个答案

权黎昕
2023-03-14

您的字典键是字符串,而不是整数,因此当您尝试对它们排序时,它们会像字符串一样排序。所以你会得到:

['6000', '3000', '30', '100']

相反,他想:

['6000', '3000', '100', '30']

将此函数改为如下所示并具有整数键:

def jewel_list(lines):
    jewels = []
    for item in lines:
        jewels.append(item.split())
    jewels = sorted(jewels, reverse= True)
    jewel_dict = {}
    for item in jewels:
        jewel_dict[int(item[1])] = item[0]  # changed line
    return jewel_dict
The greedy approach would steal $6130 of jewels.
 类似资料:
  • 本文向大家介绍贪婪算法相关面试题,主要包含被问及贪婪算法时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法。贪婪算法所得到的结果往往不是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果。贪婪算法并没有固定的算法解决框架,算法的关键是贪婪策

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

  • 设计算法以实现给定问题的最佳解决方案。 在贪婪算法方法中,决策是从给定的解决方案域做出的。 由于贪婪,选择了似乎提供最佳解决方案的最接近的解决方案。 贪心算法试图找到一个本地化的最优解决方案,最终可能导致全局优化的解决方案。 但是,通常贪婪算法不提供全局优化的解决方案。 计数硬币 这个问题是通过选择最不可能的硬币来计算到期望的值,并且贪婪的方法迫使算法选择最大可能的硬币。 如果我们提供₹1,2,5

  • 贪婪 vs 不贪婪 当重复一个正则表达式时,如用 a*,操作结果是尽可能多地匹配模式。当你试着匹配一对对称的定界符,如 HTML 标志中的尖括号时这个事实经常困扰你。匹配单个 HTML 标志的模式不能正常工作,因为 .* 的本质是“贪婪”的 #!python >>> s = '<html><head><title>Title</title>' >>> len(s) 32 >>> print re.

  • 以下是我需要咨询以寻求帮助的问题: 编写一个贪婪算法,使用贪婪算法以尽可能少的硬币进行兑换。您将获得一个硬币值数组和一个金额:。返回一个包含每个硬币计数的数组。 例如:应该返回数组,该数组指示每枚硬币的数量:2枚50美分硬币,1枚25美分硬币,1枚10美分硬币),没有镍币(5美分),和2便士(1美分),加起来是137美分。 从computeChange返回的数组应该与第一个参数(硬币)的长度相同。

  • 首先,是的,这是我的硬件,我觉得很难,所以我真的很感激一些指导。 我需要证明对于当