题目要求:给定一个数组arr=[2,3,4,5],N=2345,求使用arr中的数字,组成一个不大于N的最大的数字。arr中的数字可以多次使用。
public int max(int n, int[] arr) {
Arrays.sort(arr);
String value = String.valueOf(n);
char[] chars = value.toCharArray();
int[] nums = new int[chars.length];
for (int i = 0; i < nums.length; i++) {
nums[i] = Integer.parseInt(String.valueOf(chars[i]));
}
return dfs(arr, nums, true, 0);
}
/**
* @param arr 从中选数
* @param nums target
* @param preEq 前一个位置取值是否等于nums[index]
* @param index 当前考虑index位置
* @return 返回最大的组合值
*/
public int dfs(int[] arr, int[] nums, boolean preEq, int index) {
if (index == nums.length) {
return 0;
}
if (preEq) {
for (int i = arr.length - 1; i >= 0; i--) {
if (index == nums.length - 1) {
if (arr[i] < nums[index]) {
int temp = dfs(arr, nums, arr[i] == nums[index], index + 1);
if (temp == -1) continue;
return (int) (arr[i] * Math.pow(10, nums.length - index - 1) + temp);
}
} else {
if (arr[i] <= nums[index]) {
int temp = dfs(arr, nums, arr[i] == nums[index], index + 1);
if (temp == -1) continue;
return (int) (arr[i] * Math.pow(10, nums.length - index - 1) + temp);
}
}
}
if (index == 0) {
return dfs(arr, nums, false, index + 1);
}
return -1;
} else {
return (int) (arr[arr.length - 1] * Math.pow(10, nums.length - index - 1) + dfs(arr, nums, false, index + 1));
}
}