网站建设怎么分析市场分析求推荐专门做借条的网站
2026/6/10 11:14:41 网站建设 项目流程
网站建设怎么分析市场分析,求推荐专门做借条的网站,做外贸网站的效果怎么样,海口市建设工程质量安全监督站网站你有没有过这样的经历#xff1a;期末复习时对着《算法导论》里的动态规划章节抓耳挠腮#xff0c;明明每个字都认识#xff0c;连起来却像看天书#xff1f;或者跟着教程写好了斐波那契数列的代码#xff0c;一换“最长递增子序列”就瞬间卡壳#xff1f;其实不是你不够…你有没有过这样的经历期末复习时对着《算法导论》里的动态规划章节抓耳挠腮明明每个字都认识连起来却像看天书或者跟着教程写好了斐波那契数列的代码一换“最长递增子序列”就瞬间卡壳其实不是你不够聪明而是动态规划的教学常常跳过了“从普通人视角理解”的关键一步——它本质上是一种“聪明的穷举”更是一种解决问题的思维方式就像我们每天都在做的“规划明天穿什么”一样自然。今天这篇文章咱们不聊晦涩定理就从生活场景切入把动态规划的核心逻辑拆解得明明白白最后再用Python代码让它“活”起来。一、先搞懂动态规划到底在解决什么问题想象一个场景你要从家出发去公司地图上有10条可能的路线有的绕远但红绿灯少有的抄近路但容易堵车。你想知道“最短时间到达”的路线是哪条该怎么做最笨的办法是每条路线都走一遍计时——这就是“暴力穷举”。但聪明的做法是走到每个十字路口时都记住“从家到这里的最短时间”比如到A路口最快10分钟到B路口最快15分钟后续只需要基于这些“已知最优结果”继续计算不用再回头重算。这种“记住子问题的最优解避免重复计算”的思路就是动态规划的核心。而那些“十字路口的最短时间”就是我们要重点研究的——状态。二、动态规划的“灵魂三问”状态是什么怎么转移边界在哪动态规划的所有技巧都围绕“状态”展开。就像写文章要先确定“主题、结构、开头结尾”设计动态规划也需要回答三个问题我们一个个拆透。1. 第一问状态是什么——给子问题拍张“快照”状态说白了就是“用一组变量描述子问题的解”。比如刚才的路线问题“到A路口的最短时间”就是一个状态我们可以用dp[A]来表示。在算法里这个“快照”通常写成dp[...]的形式括号里的内容就是“状态变量”。关键原则状态要“刚刚好”——既要包含足够的信息推导下一步又不能有多余的变量浪费资源。比如你记录“到A路口的最短时间今天穿了什么鞋”就没必要鞋和路线时间毫无关系。根据变量的个数状态还分不同“维度”就像拍照的角度不同一维状态只有一个变量比如“第i天的存款”dp[i]适合线性问题。二维状态两个变量比如“从(0,0)走到(i,j)的最短路径”dp[i][j]适合网格或两个序列对比的问题。多维状态三个及以上变量比如“前i个物品、容量j、重量k的最大价值”dp[i][j][k]适合复杂场景。所有可能的状态加起来就是“状态空间”。它的大小直接决定了算法的效率——比如二维状态通常是O(n²)的复杂度这也是为什么我们有时要“压缩状态”的原因。人对“具体”的东西更容易理解。下次看到dp[i][j]别慌先给它起个“外号”比如“i行j列的最优解”瞬间就亲切了。2. 第二问状态怎么转移——找到“递推公式”知道了状态的定义下一步就是找到“如何从之前的状态得到当前状态”这就是状态转移方程也是动态规划的“核心中的核心”。还是用路线问题举例如果到A路口最快10分钟A到B路口需要5分钟到C路口最快12分钟C到B路口需要3分钟。那到B路口的最快时间怎么算自然是取两种走法的最小值dp[B] min(dp[A]5, dp[C]3)——这就是一个简单的转移方程。我们用经典的“斐波那契数列”来实战一下用Python代码把状态转移可视化def fib_dp(n): # 定义状态dp[i]表示第i个斐波那契数 dp [0] * (n 1) # 边界条件前两个数是基础 dp[0] 0 dp[1] 1 # 状态转移第i个数 第i-1个 第i-2个 for i in range(2, n 1): dp[i] dp[i-1] dp[i-2] # 打印每一步的状态可视化过程 print(f第{i}步dp[{i}] dp[{i-1}] dp[{i-2}] {dp[i-1]} {dp[i-2]} {dp[i]}) return dp[n] # 测试计算第6个斐波那契数 fib_dp(6)运行结果如下每一步的状态变化都清晰可见第2步dp[2] dp[1] dp[0] 1 0 1第3步dp[3] dp[2] dp[1] 1 1 2第4步dp[4] dp[3] dp[2] 2 1 3第5步dp[5] dp[4] dp[3] 3 2 5第6步dp[6] dp[5] dp[4] 5 3 8看是不是一点都不复杂转移方程本质上就是“当前状态 基于之前状态的计算”就像搭积木一样从基础块一步步搭出最终的结果。3. 第三问边界在哪——找到“初始状态”没有基础积木再厉害的搭建技巧也没用。动态规划的“边界条件”就是最开始的那几个已知状态比如斐波那契数列里的dp[0]0、dp[1]1。边界条件通常很简单关键是要找对——比如计算“从家到公司的路线”边界就是“家的位置时间为0”。如果边界错了后面的所有计算都会跑偏这也是很多人初学时常犯的错误。三、动态规划的“生存法则”两个必须遵守的原则不是所有问题都能用动态规划解决它有两个“硬性要求”就像游戏里的“准入门槛”满足了才能用。1. 最优子结构大问题的最优解藏着小问题的最优解比如“从家到公司的最短时间”必然包含了“从家到某个路口的最短时间”——如果到A路口的最优解是10分钟那任何经过A路口到公司的路线都必须用这个10分钟作为基础否则就不是最优解。反过来想如果一个问题的最优解里某个子问题的解不是最优的那它就不满足最优子结构不能用动态规划。比如“找从家到公司的最风景优美的路线”可能绕远路的风景更好这时候子问题的“最短路线”就不是最优解的一部分了。2. 无后效性过去的事就让它过去吧这是动态规划的“核心纪律”一旦某个状态确定了它的后续计算只和这个状态本身有关和“怎么到达这个状态的”无关。还是用路线问题举例dp[B] 15分钟这个状态确定后不管你是走路到B还是骑车到B后续计算“从B到公司的时间”都只需要用15分钟这个数值。就像你银行账户里有1000块不管是工资还是奖金来的它能买的东西都是一样的。如果一个问题有“后效性”比如“从家到B路口的时间受之前走的路线影响比如绕远路会累速度变慢”那它就不适合用动态规划。无后效性是很多人容易忽略的点。如果发现状态转移时需要“回头看之前的路径”那大概率是状态定义错了需要重新设计状态变量。四、实战预热常见的6种状态“套路”动态规划的题目千变万化但状态设计其实有“套路”可循。就像做饭有“炒、煮、炖”等方法不同问题对应不同的状态模型掌握这些模型就能应对80%的题目模型类型状态定义套路经典例题线性模型dp[i] 表示“以第i个元素结尾”的解最长递增子序列LIS区间模型dp[i][j] 表示“区间[i,j]”的解矩阵链乘法、最长回文子串背包模型dp[i][w] 表示“前i个物品容量w”的解0-1背包、完全背包状态机模型dp[i][0/1] 表示“第i步处于状态0/1”的解股票买卖、打家劫舍树形DPdp[node] 表示“以node为根的子树”的解二叉树最大路径和、树的独立集状压DPdp[mask][i] 表示“状态mask二进制当前在i”的解旅行商问题TSP这些模型不用死记硬背后续我们会逐个拆解用具体题目实战。比如下一篇我们就从最经典的“背包问题”入手聊聊怎么用动态规划解决“有限容量下装最多价值物品”的问题——是不是已经有点好奇了五、总结动态规划的“学习路线图”看到这里你应该已经明白动态规划不是“玄学”而是“先定义状态再找转移方程最后确定边界”的固定思维流程。为了帮你巩固我画了一张“学习路线图”基础阶段掌握斐波那契、爬楼梯等简单问题理解状态和转移的基本逻辑。模型阶段逐个攻克线性、背包、区间等6大模型每种模型做3-5道题。优化阶段学习状态压缩、单调队列等技巧提升算法效率。实战阶段做综合题目学会“根据问题设计状态”的核心能力。六、学以致用亲手实现一个“智能投资规划器”读到这里你已经掌握了动态规划的核心思想。现在让我们把这些知识付诸实践一起用Python构建一个智能投资规划器。这个项目不仅能巩固你对状态设计和转移方程的理解还能解决一个真实的财务规划问题项目背景你的“第一桶金”规划假设你刚拿到一笔年终奖想在未来5年内进行投资。市场上有几种投资渠道每种有不同的收益率和风险。你的目标是在满足每月生活开销的前提下5年后获得最大收益。问题抽象一个多维背包问题我们把这个问题转化为动态规划问题状态维度时间月、资金、当前投资组合决策每月如何分配资金到不同投资渠道约束必须保留足够的生活费投资有最低门槛项目小结1.真实世界的动态规划应用状态定义dp[month][capital] 第month个月拥有capital资金时的最大未来价值状态转移考虑生活费扣除、不同投资选项、通胀因素多维决策投资比例分配、风险平衡2.学到的DP技巧状态压缩资金离散化处理减少状态空间多阶段决策每月重新评估和调整投资组合约束处理生活费作为硬约束必须满足3.可视化与回溯图表展示资金增长、资产配置、收益率决策回溯从最终状态反向推导最优路径策略输出生成可执行的每月投资建议项目源码 智能投资规划器 - 动态规划实战项目 修复版修正状态转移和边界条件问题 import numpy as np from typing import List, Tuple, Dict import matplotlib.pyplot as plt from datetime import datetime import warnings warnings.filterwarnings(ignore) # 设置中文字体 plt.rcParams[font.sans-serif] [SimHei, Microsoft YaHei, DejaVu Sans] plt.rcParams[axes.unicode_minus] False class InvestmentPlanner: 智能投资规划器类 - 修复版 def __init__(self, initial_capital: float, monthly_expense: float, months: int 60, inflation_rate: float 0.02): 初始化规划器 参数: initial_capital: 初始资金元 monthly_expense: 每月生活费元 months: 投资期月默认5年60个月 inflation_rate: 年通货膨胀率 self.initial_capital initial_capital self.monthly_expense monthly_expense self.months months self.inflation_rate inflation_rate / 12 # 月通胀率 # 定义投资选项每个选项是(名称, 年收益率, 最低投资额, 风险等级) self.investments [ (货币基金, 0.025, 1000, 1), # 低风险高流动性 (债券基金, 0.045, 5000, 2), # 中低风险 (指数基金, 0.08, 10000, 4), # 中等风险 (成长股票, 0.12, 20000, 5), # 高风险 (定期存款, 0.03, 1000, 1) # 无风险 ] # 动态规划表 self.dp None self.decisions None def _calculate_monthly_return(self, annual_rate: float) - float: 将年收益率转换为月收益率 return (1 annual_rate) ** (1/12) - 1 def _adjust_for_inflation(self, amount: float, month: int) - float: 根据通胀调整金额 return amount * (1 self.inflation_rate) ** month def solve(self): 使用动态规划求解最优投资策略 - 修复版 # 1. 状态定义dp[month][capital_state] max_value # 资金离散化以1000元为单位 max_capital self.initial_capital * 3 # 假设最大资金不超过初始资金的3倍 capital_units int(max_capital // 1000) 1 n_investments len(self.investments) print(f状态空间大小: {self.months1} x {capital_units} {(self.months1)*capital_units:,} 个状态) # 初始化DP表 dp np.full((self.months 1, capital_units), -np.inf) decisions np.full((self.months 1, capital_units, n_investments 1), 0.0) # 2. 边界条件第0个月 initial_unit min(int(self.initial_capital // 1000), capital_units - 1) dp[0][initial_unit] self.initial_capital # 3. 状态转移 for month in range(self.months): print(f\r求解进度: {month1}/{self.months} 月, end, flushTrue) # 当前月的生活费考虑通胀 current_expense self._adjust_for_inflation(self.monthly_expense, month) for capital_unit in range(capital_units): current_capital dp[month][capital_unit] if current_capital 0: # 不可达状态 continue # 必须扣除生活费 if current_capital current_expense: continue # 资金不足无法继续 remaining_capital current_capital - current_expense # 选项0全部放在现金中无投资无收益 next_capital remaining_capital next_unit min(int(next_capital // 1000), capital_units - 1) if next_capital dp[month 1][next_unit]: dp[month 1][next_unit] next_capital decisions[month 1][next_unit] np.zeros(n_investments 1) decisions[month 1][next_unit][0] 1.0 # 100%现金 # 选项1-n投资到各个渠道 for invest_idx, (name, annual_rate, min_invest, risk) in enumerate(self.investments): if remaining_capital min_invest: continue # 计算月收益率 monthly_return self._calculate_monthly_return(annual_rate) # 考虑不同的投资比例 invest_ratios [0.1, 0.3, 0.5, 0.7, 0.9] for ratio in invest_ratios: invest_amount remaining_capital * ratio # 确保投资金额不低于最低投资额 if invest_amount min_invest: continue # 确保投资金额不超过剩余资金 if invest_amount remaining_capital: continue # 计算投资收益 investment_growth invest_amount * (1 monthly_return) # 剩余现金 cash_remaining remaining_capital - invest_amount # 总资金 投资增长 剩余现金 total_next_capital investment_growth cash_remaining # 确保总资金为正 if total_next_capital 0: continue next_unit min(int(total_next_capital // 1000), capital_units - 1) if total_next_capital dp[month 1][next_unit]: dp[month 1][next_unit] total_next_capital # 记录决策 decision np.zeros(n_investments 1) decision[0] cash_remaining / total_next_capital if total_next_capital 0 else 0 decision[invest_idx 1] investment_growth / total_next_capital if total_next_capital 0 else 0 decisions[month 1][next_unit] decision print(\n求解完成!) self.dp dp self.decisions decisions # 找到最终状态的最大值 final_max dp[self.months].max() if final_max -np.inf: print(警告: 未找到可行解决方案可能是约束条件太严格) return -np.inf return final_max def get_optimal_strategy(self) - List[Dict]: 回溯获取最优策略路径 - 修复版 if self.dp is None: raise ValueError(请先调用solve()方法求解) # 找到最终最优状态 final_max self.dp[self.months].max() if final_max -np.inf: return [] final_unit np.argmax(self.dp[self.months]) # 回溯路径 strategy_path [] current_unit final_unit for month in range(self.months, -1, -1): current_capital self.dp[month][current_unit] if current_capital 0 or current_capital -np.inf: break # 获取当前决策 decision self.decisions[month][current_unit] if month len(self.decisions) else np.zeros(len(self.investments) 1) strategy_path.append({ month: month, capital: current_capital, cash_ratio: float(decision[0]), investments: [ (self.investments[i][0], float(decision[i1])) for i in range(len(self.investments)) if decision[i1] 0.01 ] }) # 回溯到前一个月简化回溯实际应该记录父状态 # 这里我们简单假设前一个状态是当前状态除以一个系数 if month 0: prev_capital current_capital / 1.02 # 简单估计 current_unit min(int(prev_capital // 1000), self.dp.shape[1] - 1) return list(reversed(strategy_path)) def visualize_strategy(self): 可视化投资策略 strategy self.get_optimal_strategy() if not strategy: print(没有找到有效策略无法可视化) return # 准备数据 months [s[month] for s in strategy if s[capital] 0] capitals [s[capital] for s in strategy if s[capital] 0] if len(capitals) 2: print(有效数据不足无法生成图表) return # 提取投资比例 investment_names [inv[0] for inv in self.investments] investment_data {name: [] for name in investment_names} investment_data[现金] [] for s in strategy: if s[capital] 0: continue investment_data[现金].append(s[cash_ratio]) for name in investment_names: ratio 0 for inv_name, inv_ratio in s[investments]: if inv_name name: ratio inv_ratio investment_data[name].append(ratio) # 创建图表 fig, axes plt.subplots(2, 2, figsize(15, 10)) # 1. 总资金增长曲线 ax1 axes[0, 0] ax1.plot(months[:len(capitals)], capitals, b-, linewidth2, markero, markersize4) ax1.set_xlabel(月份) ax1.set_ylabel(总资金元) ax1.set_title(总资金增长曲线) ax1.grid(True, alpha0.3) ax1.fill_between(months[:len(capitals)], capitals, alpha0.2, colorblue) # 添加初始和最终资金标注 ax1.annotate(f初始: ¥{capitals[0]:,.0f}, xy(months[0], capitals[0]), xytext(5, 10), textcoordsoffset points) if len(capitals) 1: ax1.annotate(f最终: ¥{capitals[-1]:,.0f}, xy(months[-1], capitals[-1]), xytext(-60, 10), textcoordsoffset points, bboxdict(boxstyleround,pad0.3, fcyellow, alpha0.5)) # 2. 资产配置堆叠图 ax2 axes[0, 1] if len(months) 0: bottom np.zeros(min(len(months), len(capitals))) colors [#4CAF50, #2196F3, #FF9800, #F44336, #9C27B0, #795548] for idx, (name, color) in enumerate(zip([现金] investment_names, colors)): if name in investment_data and len(investment_data[name]) len(bottom): data investment_data[name] ax2.bar(range(len(data)), data, bottombottom, labelname, colorcolor, alpha0.8) bottom data ax2.set_xlabel(月份索引) ax2.set_ylabel(资产配置比例) ax2.set_title(每月资产配置) ax2.legend(locupper left, bbox_to_anchor(1, 1)) ax2.set_ylim(0, 1) # 3. 每月收益对比 ax3 axes[1, 0] if len(capitals) 1: monthly_returns [] valid_months [] for i in range(1, len(capitals)): if capitals[i-1] 0: # 避免除以0 monthly_return (capitals[i] - capitals[i-1]) / capitals[i-1] * 100 monthly_returns.append(monthly_return) valid_months.append(i) if monthly_returns: colors [green if r 0 else red for r in monthly_returns] ax3.bar(valid_months, monthly_returns, alpha0.7, colorcolors) ax3.axhline(y0, colorr, linestyle-, alpha0.3) ax3.set_xlabel(月份) ax3.set_ylabel(月收益率 (%)) ax3.set_title(每月收益率) ax3.grid(True, alpha0.3) # 4. 投资选项的风险收益散点图 ax4 axes[1, 1] # 计算各投资选项的风险收益 risks [inv[3] for inv in self.investments] returns [inv[1] * 100 for inv in self.investments] # 转换为百分比 names [inv[0] for inv in self.investments] scatter ax4.scatter(risks, returns, s200, alpha0.6, creturns, cmapviridis, edgecolorsblack) # 添加标签 for i, name in enumerate(names): ax4.annotate(f{name}\n{returns[i]:.1f}%, (risks[i], returns[i]), xytext(5, 5), textcoordsoffset points, fontsize9, hacenter) ax4.set_xlabel(风险等级 (1-5)) ax4.set_ylabel(年收益率 (%)) ax4.set_title(投资选项的风险收益特征) ax4.grid(True, alpha0.3) plt.tight_layout() # 添加总标题 fig.suptitle(智能投资规划器 - 最优策略分析, fontsize16, y1.02) plt.show() # 打印关键指标 print(\n *60) print(投资规划总结报告) print(*60) print(f初始资金: {self.initial_capital:,.2f} 元) print(f每月生活费: {self.monthly_expense:,.2f} 元) print(f规划期: {self.months} 个月 ({self.months//12} 年)) if capitals and len(capitals) 1: final_capital capitals[-1] print(f最终资金: {final_capital:,.2f} 元) print(f总收益率: {(final_capital - self.initial_capital) / self.initial_capital * 100:.2f}%) print(f年化收益率: {((final_capital / self.initial_capital) ** (12/self.months) - 1) * 100:.2f}%) else: print(无法计算最终收益) print(*60) def run_demo(): 运行演示示例 - 修复版 print(*60) print(智能投资规划器 - 动态规划实战演示) print(*60) # 使用更合理的示例参数 initial_capital 200000 # 增加初始资金到20万元 monthly_expense 3000 # 降低每月生活费到3000元 years 3 # 缩短到3年规划 print(f初始资金: {initial_capital:,.2f} 元) print(f每月生活费: {monthly_expense:,.2f} 元) print(f规划年限: {years} 年) print(-*60) # 创建规划器实例 planner InvestmentPlanner( initial_capitalinitial_capital, monthly_expensemonthly_expense, monthsyears*12 ) # 求解最优策略 print(开始求解最优投资策略...) final_capital planner.solve() if final_capital -np.inf: print(未找到可行解决方案。尝试调整参数) print(1. 增加初始资金) print(2. 减少每月生活费) print(3. 缩短投资年限) return # 显示结果 print(f\n最优策略最终资金: {final_capital:,.2f} 元) print(f总收益: {final_capital - initial_capital:,.2f} 元) # 可视化策略 planner.visualize_strategy() # 显示详细策略 print(\n投资策略示例前6个月:) strategy planner.get_optimal_strategy() if strategy: for i, month_plan in enumerate(strategy[:6]): if month_plan[capital] 0: print(f\n第{month_plan[month]}个月:) print(f 总资金: {month_plan[capital]:,.2f} 元) print(f 现金比例: {month_plan[cash_ratio]:.1%}) if month_plan[investments]: print( 投资分配:) for inv_name, inv_ratio in month_plan[investments]: if inv_ratio 0.01: print(f - {inv_name}: {inv_ratio:.1%}) else: print( 本月无投资) else: print(未能生成详细策略) print(\n *60) print(提示: 查看上方的图表可视化以获得更直观的理解!) print(*60) def interactive_mode(): 交互式模式让用户输入自己的参数 print(*60) print(智能投资规划器 - 个性化配置) print(*60) try: # 获取用户输入 print(\n请输入您的财务参数) initial_capital float(input(初始资金元: )) monthly_expense float(input(每月生活费元: )) years int(input(规划年限年建议1-5年: )) if years 0 or years 10: print(规划年限应在1-10年之间已设置为3年) years 3 # 创建并运行规划器 planner InvestmentPlanner( initial_capitalinitial_capital, monthly_expensemonthly_expense, monthsyears*12 ) print(\n正在计算最优投资策略...) final_capital planner.solve() if final_capital -np.inf: print(\n警告: 未找到可行解决方案!) print(可能原因:) print(f1. 初始资金({initial_capital:,.0f}元)不足以支付{years}年的生活费) print(f2. 每月生活费({monthly_expense:,.0f}元)过高) print(\n建议:) print(1. 增加初始资金) print(2. 减少每月生活费) print(3. 缩短投资年限) return print(f\n计算完成) print(f初始资金: {initial_capital:,.2f} 元) print(f{years}年后预期资金: {final_capital:,.2f} 元) print(f总收益率: {(final_capital - initial_capital) / initial_capital * 100:.2f}%) print(f年化收益率: {((final_capital / initial_capital) ** (1/years) - 1) * 100:.2f}%) # 询问是否可视化 show_viz input(\n是否显示可视化图表(y/n): ).lower() if show_viz y: planner.visualize_strategy() # 询问是否保存策略 save_strategy input(\n是否保存详细策略到文件(y/n): ).lower() if save_strategy y: strategy planner.get_optimal_strategy() filename finvestment_strategy_{datetime.now().strftime(%Y%m%d_%H%M%S)}.txt with open(filename, w, encodingutf-8) as f: f.write(*60 \n) f.write(智能投资规划器 - 个性化投资策略报告\n) f.write(*60 \n\n) f.write(f生成时间: {datetime.now().strftime(%Y-%m-%d %H:%M:%S)}\n) f.write(f初始资金: {initial_capital:,.2f} 元\n) f.write(f每月生活费: {monthly_expense:,.2f} 元\n) f.write(f规划年限: {years} 年\n) f.write(f最终资金: {final_capital:,.2f} 元\n\n) f.write(投资选项说明:\n) f.write(-*60 \n) for name, rate, min_inv, risk in planner.investments: f.write(f{name}: 年化{rate:.1%}, 最低{min_inv:,}元, 风险{risk}/5\n) if strategy: f.write(\n每月详细策略:\n) f.write(-*60 \n) for month_plan in strategy: if month_plan[capital] 0: f.write(f\n第{month_plan[month]}个月:\n) f.write(f 总资金: {month_plan[capital]:,.2f} 元\n) f.write(f 现金比例: {month_plan[cash_ratio]:.1%}\n) if month_plan[investments]: f.write( 投资分配:\n) for inv_name, inv_ratio in month_plan[investments]: if inv_ratio 0.01: f.write(f - {inv_name}: {inv_ratio:.1%}\n) else: f.write(\n未能生成详细策略\n) f.write(\n *60 \n) f.write(风险提示: 投资有风险本报告仅供参考\n) f.write(*60 \n) print(f\n策略已保存到: {filename}) except ValueError as e: print(f输入错误: {e}) except Exception as e: print(f发生错误: {e}) def simple_dp_demo(): 一个更简单的动态规划示例更容易理解和运行 print(\n *60) print(简化版动态规划示例背包问题) print(*60) # 背包问题在容量限制下最大化价值 capacity 10 # 背包容量 weights [2, 3, 4, 5] # 物品重量 values [3, 4, 5, 6] # 物品价值 n len(weights) print(f背包容量: {capacity}) print(f物品重量: {weights}) print(f物品价值: {values}) print(-*60) # 初始化DP表 dp [[0] * (capacity 1) for _ in range(n 1)] # 状态转移 for i in range(1, n 1): for w in range(1, capacity 1): if weights[i-1] w: dp[i][w] max(dp[i-1][w], dp[i-1][w-weights[i-1]] values[i-1]) else: dp[i][w] dp[i-1][w] # 输出DP表 print(DP表状态转移矩阵:) print( .join(f{w:2d} for w in range(capacity 1))) for i in range(n 1): if i 0: print(0: .join(f{dp[i][w]:2d} for w in range(capacity 1))) else: print(f{i}: .join(f{dp[i][w]:2d} for w in range(capacity 1))) print(\n最优解:) max_value dp[n][capacity] print(f最大价值: {max_value}) # 回溯找出选了哪些物品 selected [] w capacity for i in range(n, 0, -1): if dp[i][w] ! dp[i-1][w]: selected.append(i-1) w - weights[i-1] print(f选中的物品索引: {selected}) print(f选中的物品重量: {[weights[i] for i in selected]}) print(f选中的物品价值: {[values[i] for i in selected]}) print(\n *60) print(动态规划核心思想总结:) print(1. 状态定义: dp[i][w] 前i个物品在容量w下的最大价值) print(2. 状态转移: dp[i][w] max(不选第i个物品, 选第i个物品)) print(3. 边界条件: dp[0][w] 0 (没有物品时价值为0)) print(4. 最优子结构: 大问题的最优解包含子问题的最优解) print(5. 无后效性: 当前状态只依赖之前的状态) print(*60) if __name__ __main__: print(请选择运行模式:) print(1. 快速演示使用示例参数) print(2. 交互模式输入个人参数) print(3. 简化DP示例背包问题) choice input(\n请输入选择 (1, 2 或 3): ) if choice 1: run_demo() elif choice 2: interactive_mode() elif choice 3: simple_dp_demo() else: print(无效选择运行简化DP示例...) simple_dp_demo()如何运行这个项目安装必要库pip install numpy matplotlib2.运行程序

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询