Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中的UVa 11450-dp_Python_Dynamic Programming - Fatal编程技术网

python中的UVa 11450-dp

python中的UVa 11450-dp,python,dynamic-programming,Python,Dynamic Programming,我正在努力完成UVa在线评委的任务 我已经成功地用C++来编码,并得到AC. 不幸的是,我不能在python-TLE中做同样的事情 我想学习用python编写代码,这就是我使用它的原因。我知道C++对于竞争编程等速度更快,更好。 你知道这个代码有什么问题吗?我怎样才能提高它去拿空调 from sys import stdin, stdout def shop(money, curr_g): if money < 0: return -1 if curr

我正在努力完成UVa在线评委的任务

<>我已经成功地用C++来编码,并得到AC. 不幸的是,我不能在python-TLE中做同样的事情

我想学习用python编写代码,这就是我使用它的原因。我知道C++对于竞争编程等速度更快,更好。 你知道这个代码有什么问题吗?我怎样才能提高它去拿空调

from sys import stdin, stdout


def shop(money, curr_g):
    if money < 0:
        return -1
    if curr_g == c:
        return m - money
    if memo[money][curr_g] is not -1:
        return memo[money][curr_g]
    ans = -1
    for model in range(1, price[curr_g][0] + 1):
        ans = max(ans, shop(money - price[curr_g][model], curr_g + 1))
    memo[money][curr_g] = ans
    return ans


price = list(list() for i in range(21))
memo = list(list(-1 for j in range(21)) for i in range(201))
n = int(input())
for i in range(n):
    m, c = map(int, stdin.readline().split())
    for a in range(c):
        price[a] = [int(x) for x in stdin.readline().split()]

    for a in range(201):
        for b in range(21):
            memo[a][b] = -1

    ans = shop(m, 0)
    stdout.write(str(ans) + "\n") if ans >= 0 else stdout.write('no solution\n')
从系统导入标准输入,标准输出
def商店(货币、货币):
如果货币<0:
返回-1
如果curr_g==c:
返还m-货币
如果备忘录[货币][货币]不是-1:
返回备忘录[货币][货币]
ans=-1
对于范围内的型号(1,价格[货币][0]+1):
ans=最大值(ans,商店(货币价格[货币][型号],货币+1))
备忘录[货币][货币]=ans
返回ans
价格=列表(列表()表示范围(21)内的i)
备注=列表(列表(-1表示范围(21)中的j)表示范围(201)中的i)
n=int(输入())
对于范围(n)中的i:
m、 c=map(int,stdin.readline().split())
对于范围(c)内的a:
价格[a]=[stdin.readline().split()中x的整数(x)]
对于范围(201)内的a:
对于范围(21)内的b:
备忘录[a][b]=-1
ans=车间(m,0)
如果ans>=0,则stdout.write(str(ans)+“\n”),否则stdout.write('无解决方案\n')

我不知道UVa,但是,除非它是一个垃圾系统(看起来不太可能),否则您的问题几乎肯定是您使用了错误的算法。任何接受Python等语言代码的在线评判系统都会设计它们的问题,以便即使使用Python,正确的算法也足够快,但错误的算法太慢,即使使用经过严格优化的C语言实现。因此,尽管确实可以做些事情,以恒定的因数来加速一些事情(例如,使用列表理解,而不是将生成器理解传递给
列表
,不要将
备忘录
构建为包含420个
-1
的列表,以便稍后将它们全部重新分配给
-1
,等等。),这些在这里可能不相关。顺便说一句,
不是-1
测试是不正确的,即使您可能会侥幸逃脱。在Python中,
是对同一对象的两个对象进行测试。在默认的CPython构建中,
-1
的两个单独副本恰好如此,因为它在tegers,因为它在模块中折叠文本常量,但语言根本不能保证这一点。如果要测试相等性,请使用
=
!=
,而不是
不是