题目描述
- 给定两个数组:
- int]d,d[i]:i号怪兽的能力
- int]p,p[]:i号怪兽要求的钱
- 开始时你的能力是0,你的目标是从0号怪兽开始,通过所有的怪兽:
- 如果你当前的能力,小干i号怪兽的能力,你必须付出i号怪兽的钱,贿略这个怪兽,然后怪兽就会加入你,他的能力直接累加到你的能力上;
- 如果你当前的能力,大于等于i号怪兽的能力,你可以选择直接通过,你的能力并不会下降,
你也可以选择贿赂这个怪兽,然后怪兽就会加入你,他的能力直接累加到你的能力上。
- 返回通过所有的怪兽,需要花的最小钱数。
举例
d:{5, 3, 1, 1, 1, 8}
p:{2, 1, 2, 2, 2, 30}
返回:3 (只需要贿赂前两个就够了)
思路
- 对于每个怪兽你可以选择 进行贿赂或者不贿赂
- 当你的能力小于他时必须贿赂
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, 0, 0);
7 }
8
9
19 public static int minMoney(int[] d, int[] p, int ability, int index) {
20
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 = {5, 3, 1, 1, 1, 8};
36 int[] p = {2, 1, 2, 2, 2, 30};
37 System.out.println(minMoneyToBattle(d, p));
38 }
39}