Code33 打怪兽问题

336 阅读2分钟

题目描述

  • 给定两个数组:
  • int]d,d[i]:i号怪兽的能力
  • int]p,p[]:i号怪兽要求的钱
  • 开始时你的能力是0,你的目标是从0号怪兽开始,通过所有的怪兽:
  • 如果你当前的能力,小干i号怪兽的能力,你必须付出i号怪兽的钱,贿略这个怪兽,然后怪兽就会加入你,他的能力直接累加到你的能力上;
  • 如果你当前的能力,大于等于i号怪兽的能力,你可以选择直接通过,你的能力并不会下降,
    你也可以选择贿赂这个怪兽,然后怪兽就会加入你,他的能力直接累加到你的能力上。
  • 返回通过所有的怪兽,需要花的最小钱数。

举例

d:{531118}
p:{2122230}

返回:3 (只需要贿赂前两个就够了)

思路

  1. 对于每个怪兽你可以选择 进行贿赂或者不贿赂
  2. 当你的能力小于他时必须贿赂

code

 1public class Code33 {
 2    public static int minMoneyToBattle(int[] d, int[] p) {
 3        if (d.length <= 0 || d.length != p.length) {
 4            return 0;
 5        }
 6        return minMoney(d, p, 00);
 7    }
 8
 9    /**
10     * 目前你的能力是ability,你来到了index号怪兽面前,
11     * 如果要通过index及其以后所有的怪兽,最少需要多少钱
12     *
13     * @param d       d[i] i号怪兽的能力
14     * @param p       p[i] i号怪兽要求的钱
15     * @param ability 当前自己具备的能力
16     * @param index   你来到了第index个怪兽面前
17     * @return 返回需要花的最少钱数
18     */
19    public static int minMoney(int[] d, int[] p, int ability, int index) {
20        // 最后一个怪兽 不需要花钱 base case
21        if (index == d.length) {
22            return 0;
23        }
24        // 当前你的能力小于这个怪兽的能力,则必须收买他
25        if (ability < d[index]) {
26            return p[index] + minMoney(d, p, ability + d[index], index + 1);
27        }
28        // 当前你的能力大于这个怪兽的能力,你也可以选择不收买或者收买 (求一个最小值)
29        return Math.min(minMoney(d, p, ability, index + 1),
30                // 收买
31                p[index] + minMoney(d, p, ability + d[index], index + 1));
32    }
33
34    public static void main(String[] args) {
35        int[] d = {531118};
36        int[] p = {2122230};
37        System.out.println(minMoneyToBattle(d, p));
38    }
39}