1 条题解
-
0
#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
- 上传者