DPL_1_A:Coin Changing Problem [动态规划]

本文介绍了一个经典的动态规划问题——硬币找零问题,并提供了一种高效的算法实现方式。通过分析最少数量的硬币组合来构成特定金额,文章详细解释了动态规划的应用过程,包括状态定义、状态转移方程以及边界条件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接
现在给了m枚不同面值的硬币,要求用最少的硬币凑出n元钱,求出所需要的最少的硬币的数量;
用动态规划来做,现在用:
dp[i][j]=x d p [ i ] [ j ] = x 表示现在用第1-i枚硬币,凑出价值为j的钱需要的最少的硬币数量为x;
可以想到:
dp[i][j]=min(dp[i1][j],dp[i][jc[i]]+1) d p [ i ] [ j ] = m i n ( d p [ i − 1 ] [ j ] , d p [ i ] [ j − c [ i ] ] + 1 )

想到,其实不需要保存i这个变量,只需要使用dp[j]就可以了:
dp[i]=min(dp[i],dp[ic[j]]+1) d p [ i ] = m i n ( d p [ i ] , d p [ i − c [ j ] ] + 1 )
伪代码如此:

for(i from 1 to m)
    for(j from c[i] to n)
        dp[j]=min(dp[j],dp[j-c[i]]);

初始化的时候有2点:
1.不论用多少硬币凑出0元都只需要0个硬币;
2.用0个硬币凑出大于0元的价值都需要INF的硬币;

最后代码如此:

#include <cstdio>
#include <iostream>
using namespace std;
const int maxn=1e5;
const int maxm=2e2+6;
const int INF=0x7fffffff;

int c[maxm],dp[maxn];
int n,m;

int main (){
    std::ios::sync_with_stdio(false);
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        cin>>c[i];
    }
    dp[0]=0;
    for(int i=1;i<=n;i++){
        dp[i]=INF;
    }
    for(int i=1;i<=m;i++){
        for(int j=c[i];j<=n;j++){
            dp[j]=min(dp[j],dp[j-c[i]]+1);
        }
    }
    cout<<dp[n]<<endl;
    return 0;
}

错点:
1.一开始我一直在考虑可能有些价值凑不出来的问题,忽略了题目里有限制条件The denominations are all different and contain 1. 所以所有价值都是可以凑出来的;
2.初始化条件要注意上面的2点;

# ==================== GCD Routing 脚本 (修改版) ==================== # 设计名称与工艺平台 set DESIGN_NAME "microwatt" set ACTUAL_TOP_MODULE_NAME "microwatt" set PLATFORM "nangate45" # --- 路径配置 --- set PLATFORM_DIR "./platforms/${PLATFORM}" set RESULTS_DIR "./results/${PLATFORM}/${DESIGN_NAME}/routing" set SDC_FILE "./results/${PLATFORM}/${DESIGN_NAME}/cts/4_cts.sdc" file mkdir $RESULTS_DIR # === 技术文件配置 === set TECH_LEF "${PLATFORM_DIR}/lef/NangateOpenCellLibrary.tech.lef" set SC_LEF "${PLATFORM_DIR}/lef/NangateOpenCellLibrary.macro.mod.lef" set LIB_FILES "${PLATFORM_DIR}/lib/NangateOpenCellLibrary_typical.lib" # === 环境变量配置 === set ::env(CELL_PAD_IN_SITES_DETAIL_PLACEMENT) 4 set ::env(DONT_USE_CELLS) "TAPCELL_* FILLER_*" set ::env(SCRIPTS_DIR) "./scripts" set ::env(REPORTS_DIR) "./reports" set ::env(LIB_FILES) $LIB_FILES set ::env(RESULTS_DIR) $RESULTS_DIR # === 新增拥塞优化参数 === set ::env(MIN_ROUTING_LAYER) metal2 set ::env(MAX_ROUTING_LAYER) metal10 set ::env(FILL_CELLS) "FILLCELL_X1 FILLCELL_X2 FILLCELL_X4 FILLCELL_X8 FILLCELL_X16 FILLCELL_X32" set ::global_route_congestion_report "$::env(REPORTS_DIR)/congestion.rpt" set ::env(ROUTING_LAYER_ADJUSTMENT) 0.2 ;# 降低布线层使用率(原0.4) set ::env(GLB_RT_MAX_DIODE_INS_ITERS) 10 ;# 增加二极管插入迭代次数 set ::env(GLB_RT_OVERFLOW_ITERS) 100 ;# 增加拥塞优化迭代次数 set ::env(GLB_RT_ADJUSTMENT) 0.3 ;# 增加布线资源调整因子 set ::env(GLB_RT_ALLOW_CONGESTION) 0.1 ;# 允许轻度拥塞 set ::env(GLB_RT_L1_ADJUSTMENT) 0.99 ;# 调整金属层1资源分配 # ==== 读取设计 ==== read_lef $TECH_LEF read_lef $SC_LEF read_liberty $LIB_FILES read_db "./results/${PLATFORM}/${DESIGN_NAME}/cts/4_1_cts.odb" read_sdc $SDC_FILE # 加载平台RC配置文件 source ${PLATFORM_DIR}/setRC.tcl source $::env(SCRIPTS_DIR)/util.tcl # ==== 全局布线优化 ==== puts "=== 开始增强型全局布线 ===" # 执行引脚布线访问 pin_access -bottom_routing_layer $::env(MIN_ROUTING_LAYER) \ -top_routing_layer $::env(MAX_ROUTING_LAYER) # 执行全局布线(增加拥塞优化迭代) global_route -congestion_iterations 50 \ -congestion_report_file $::global_route_congestion_report \ -verbose 2 set_placement_padding -global \ -left $::env(CELL_PAD_IN_SITES_DETAIL_PLACEMENT) \ -right $::env(CELL_PAD_IN_SITES_DETAIL_PLACEMENT) # 设置传播时钟 set_propagated_clock [all_clocks] estimate_parasitics -global_routing set_dont_use $::env(DONT_USE_CELLS) # 天线效应预检查 check_antennas -report_file $::env(REPORTS_DIR)/antenna_pre.rpt # Repair design using global route parasitics repair_design_helper # Running DPL to fix overlapped instances global_route -start_incremental detailed_placement global_route -end_incremental \ -congestion_report_file $::env(REPORTS_DIR)/congestion_post_repair_design.rpt # Repair timing using global route parasitics puts "Repair setup and hold violations..." estimate_parasitics -global_routing repair_timing_helper # Running DPL to fix overlapped instances global_route -start_incremental detailed_placement global_route -end_incremental \ -congestion_report_file $::env(REPORTS_DIR)/congestion_post_repair_timing.rpt # 保存全局布线结果 write_def $ RESULTS_DIR/5_1_grt.def write_db $ RESULTS_DIR/5_1_grt.odb # ==== 详细布线优化 ==== puts "=== 开始详细布线(含拥塞优化)===" # 配置高级布线参数 set detailed_route_args " -output_drc $::env(REPORTS_DIR)/route_drc.rpt -output_maze $::env(REPORTS_DIR)/maze.log -drc_report_iter_step 10 -verbose 3 -bottom_routing_layer $::env(MIN_ROUTING_LAYER) -top_routing_layer $::env(MAX_ROUTING_LAYER) -distributed -num_cpus 4 " # 迭代式布线修复(3次迭代) for {set i 0} {$ i < 3} {incr i} { detailed_route {*}$detailed_route_args repair_antennas -iterations 5 } # 保存详细布线结果 write_def $RESULTS_DIR/5_2_route.def write_db $RESULTS_DIR/5_2_route.odb # ==== 填充单元插入 ==== puts "=== 开始填充单元插入 === " filler_placement $::env(FILL_CELLS) write_def $ RESULTS_DIR/5_3_fillcell.def write_db $ RESULTS_DIR/5_3_fillcell.odb # 最终设计检查 check_antennas -report_file $::env(REPORTS_DIR)/antenna_final.rpt report_design_area -file $::env(REPORTS_DIR)/area_final.rpt puts "Routing阶段完成!优化后拥塞率降低至可接受范围" 检查脚本语句语法是否错误
最新发布
07-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值