You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python流程控制异常?DP背包问题代码数组行同步修改原因求助

问题分析:DP数组多行同步修改的原因与解决办法

你遇到的这个奇怪现象,根源是Python里列表乘法的一个常见陷阱——引用复用,咱们来拆解清楚:

为什么所有行都会同步变化?

你创建DP数组的代码是:

dp = [[False] * (run_sum+1)] * (n+1)

这里的* (n+1)并没有生成n+1个独立的子列表,而是让这n+1个位置都指向同一个子列表对象。打个比方,就像你复制了n+1个指向同一个房间的钥匙,不管用哪把钥匙开门修改房间里的东西,其他钥匙打开的都是同一个房间,自然看到的变化是一样的。

用一个简单的例子就能验证这个逻辑:

row = [False, False]
dp = [row] * 3
dp[0][0] = True
print(dp)  # 输出 [[True, False], [True, False], [True, False]]

修改第一行的元素后所有行都跟着变,就是因为它们共享同一个子列表引用。

怎么修复这个问题?

要创建真正独立的多行数组,得用列表推导式,让每一行都单独生成:

dp = [[False]*(run_sum+1) for _ in range(n+1)]

这个写法会循环n+1次,每次都新建一个[False]*(run_sum+1)的列表,这样每一行都是完全独立的对象,修改某一行就不会影响其他行了。

把你代码里的DP数组创建换成这个写法后,再运行就能看到只有i=1的行被修改,其他行保持初始状态,完全符合你原本的DP逻辑预期。

额外小提示

你的代码里外层循环写的是range(1, 2),也就是只执行了i=1这一次循环,应该是你用来测试的临时代码吧?后续如果要完成完整的背包问题逻辑,记得把循环改成range(1, n+1)哦。

内容的提问来源于stack exchange,提问作者YoshiZ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:38:53