1 条题解

  • 0
    @ 2026-1-27 21:28:20
    #include <bits/stdc++.h>
    using namespace std;
    
    // [1] arr数组-存储1~10公里的乘车费用,下标1-10对应1-10公里
    int arr[20],n;
    // [2] dp数组-动态规划状态,dp[j]表示行驶j公里的最小费用
    int dp[1000];
    
    int main() {
        // 问题分析:完全背包问题,可无限次选择1~10公里的乘车段,求行驶n公里的最小费用
        // 解题步骤:1.读取1~10公里的费用;2.初始化dp数组为极大值(表示不可达),dp[0]=0(0公里费用为0);
        //          3.完全背包正序遍历,枚举每一种公里段,更新对应行驶里程的最小费用;4.输出dp[n]
        
        // 读取1~10公里的乘车费用
        for(int i=1;i<=10;i++) cin>>arr[i];  // [3] 读入第i公里的费用
        cin>>n;  // [4] 读入总行驶公里数n
        
        // 初始化dp数组:0x3f代表极大值(表示初始时所有里程不可达)
        memset(dp,0x3f,sizeof(dp));
        dp[0]=0;  // [5] 初始化:行驶0公里的费用为0
        
        // 完全背包核心循环:枚举每一种可选的公里段(1~10公里)
        for(int i=1;i<=10;i++){  // [6] 外层循环:遍历1~10公里的乘车段
            for(int j=1;j<=n;j++){  // [7] 内层循环:遍历总行驶里程j(正序遍历,允许重复选择同一公里段)
                if(j>=i){  // [8] 当总里程j≥当前段的公里数i时,才可以选择该段
                    // [9] 状态转移:不选当前段则dp[j]不变;选当前段则取dp[j-i]+arr[i](前j-i公里的最小费用+当前段费用),取最小值
                    dp[j]=min(dp[j],dp[j-i]+arr[i]);
                } 
            }
        }
        cout<<dp[n];  // [10] 输出行驶n公里的最小费用
        return 0;
    }
    
    • 1

    信息

    ID
    1331
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者