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

如何运行快速动态规划算法输出全部无重复结果

如何修改动态规划算法输出所有不重复的最优结果

我明白你的需求啦——原本的动态规划算法只输出最优的那一条结果,但你需要它输出所有能达到最优值的不重复结果,而且你的场景里有20个条目。下面我给你梳理一下具体的修改思路和实现要点:

核心思路转变

标准动态规划(DP)通常只记录每个状态的最优数值(比如最大价值、最长长度),以及回溯时的单一路径。要输出所有结果,我们需要把DP的状态存储从「单一数值」改成「所有能达到该最优值的路径集合」,同时在过程中处理重复路径的问题。

具体修改步骤

1. 调整DP状态的存储结构

  • 假设你原来的DP数组是dp[i]表示前i个条目对应的最优值,现在要把dp[i]改成存储所有能得到该最优值的路径集合(比如用哈希集合存储元组,因为列表不可哈希,方便去重)。
  • 举个例子,如果是0-1背包问题,原来dp[j]是容量j时的最大价值,现在dp[j]要存所有能达到这个最大价值的物品组合。

2. 路径去重处理

20个条目可能会产生大量重复路径,必须提前处理:

  • 预处理去重:先把所有条目排序,相同属性的条目放在一起。处理时,如果当前条目和前一个完全相同,且前一个条目没有被选中,就跳过当前选择,避免生成重复组合。
  • 存储层去重:用哈希集合(比如Python的set)存储每个状态下的路径,确保相同的路径不会被重复添加。

3. 回溯收集所有结果

当DP表填充完成后,从最终的最优状态开始回溯,遍历所有可能的前驱状态,直到初始状态,把所有完整路径收集起来。

示例代码框架(以0-1背包场景为例)

假设你的场景类似背包问题(求最优价值的所有组合),下面是一个可参考的实现:

def get_all_optimal_results(items, target_capacity):
    # 先排序,方便后续去重
    items.sort()
    item_count = len(items)
    
    # dp[j] 存储所有能达到容量j的最优价值组合(用元组存,方便哈希去重)
    dp = [set() for _ in range(target_capacity + 1)]
    dp[0].add(())  # 初始状态:空组合对应容量0
    
    for i in range(item_count):
        # 倒序遍历,避免重复选择同一物品(0-1背包特性)
        for j in range(target_capacity, items[i][0] - 1, -1):
            # 遍历当前容量减去当前物品容量后的所有组合
            for combo in dp[j - items[i][0]]:
                new_combo = combo + (items[i],)
                # 确保新组合不在当前状态中才添加
                if new_combo not in dp[j]:
                    dp[j].add(new_combo)
    
    # 找到最大的价值对应的容量(假设目标是最大价值)
    max_value_cap = max(j for j in range(target_capacity + 1) if dp[j])
    # 把元组转成列表,方便阅读
    all_unique_results = [list(combo) for combo in dp[max_value_cap]]
    return all_unique_results

针对20个条目的优化提示

  • 如果你的条目里有大量重复项,排序后跳过重复选择能大幅减少计算量,避免不必要的状态转移。
  • 若结果数量极大,可以考虑在回溯过程中实时去重,而不是全部存储后再处理,节省内存。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:06:56