题目:
一个特别的单行街道在每公里处有一个汽车站。顾客根据他们乘坐汽车的公里使来付费。例如下表就是一个费用的单子。
- 没有一辆车子行驶超过10公里,一个顾客打算行驶n公里(1< =n< =100),它可以通过无限次的换车来完成旅程。最后要求费用最少。 输入
- 第一行十个整数分别表示行走1到10公里的费用(< =500)。注意这些数并无实际的经济意义,即行驶10公里费用可能比行驶一公里少。
- 第二行一个整数n表示,旅客的总路程数。 输出 仅一个整数表示最少费用。 样例输入 12 21 31 40 49 58 69 79 90 101 15 结果是147
public class 动态规划 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] pri = new int[11]; // 价格
int[] dp = new int[100]; // 存取到达个个公里的最小价值
for (int i = 1; i < pri.length; i++) {
pri[i] = sc.nextInt();
}
int N = sc.nextInt(); // 要走多少公里
dp[1] = pri[1]; // 第一公里的价格只能有一种方法 dp[0]—的时候就是说明直接取 pri对应公里数的值,不需要与先前 dp的值相加
for (int i = 2; i <= N; i++) { //每循环一次i 也就等于求出了第i公里的最优解了
int minv = 100000; //没次求时,都需要先有一个无穷大的作比较
for (int k = 1; k <= 10 && i - k >= 0; k++) { //k其实就是为了取到10种公里的票价 分别与之前 各种dp的最优解相加,后 取的最小的值
minv = MIN(minv, dp[i - k] + pri[k]);
}
dp[i] = minv; //每次求出最优解后 保存给第i公里的dp,好让后面的 i+1 公里时 使用
}
System.out.println(dp[N]);
/* 本题的最终思路就时把每次走1~10公里的个个可能都算出来,然后与之前的 dp相加,
* *随着 dp越来越大, 我们可以求的最大公里数 N 也就可以算出来
* * 比较第N-10公里 到 N-0公里的最优解*/
}
static int MIN(int x, int y) {
if (x < y)
return x;
else
return y;
}
}