奇安信8.1笔试编程题(Java岗)
第一题
01背包问题,输入总预算,物资种类、价格和使用价值,求最大使用价值。
通过率100%。
import java.util.Scanner;
public class Money {
public static void main(String [] args) {
Scanner sc = new Scanner(System.in);
int allMoney = sc.nextInt();
int n = sc.nextInt();
int[] w = new int[n];
int[] v = new int[n];
int[][] dp = new int[n + 1][allMoney + 1];
for (int i = 0; i < n; i++) {
w[i] = sc.nextInt();
v[i] = sc.nextInt();
}
for (int i = 1; i < n + 1; i++) {
for (int j = 1; j < allMoney + 1; j++) {
if (j >= w[i - 1]) {
dp[i][j] = Math.max(dp[i - 1][j - w[i - 1]] + v[i - 1], dp[i - 1][j]);
} else {
dp[i][j] = dp[i - 1][j];
}
}
}
System.out.print(dp[n][allMoney]);
}
}第二题
亲7数,即能被7整除的数。给出n个数的数字数组,通过排列组合成n位数,重复也要计算,找出其中的亲7数。
通过率100%。
import java.util.ArrayList;
public class ReletiveSeven {
public static void main(String [] args) {
ReletiveSeven rs = new ReletiveSeven();
System.out.println(rs.reletive_7(new int[]{1,1,2}));
}
private ArrayList<Integer> list = new ArrayList<>();
private boolean[] used;
public int reletive_7 (int[] digit) {
int length = digit.length, res = 0;
used = new boolean[length];
for (int i = 0; i < length; i++) {
dfs(digit, i, length, 1, 0);
}
for (int i : list) {
if (i % 7 == 0) {
res++;
}
}
return res;
}
public void dfs (int[] digit, int i, int length, int now, int number) {
used[i] = true;
number = number * 10 + digit[i];
if (now == length) {
list.add(number);
used[i] = false;
return;
}
for (int j = 0; j < length; j++) {
if (!used[j]) {
dfs(digit, j, length, now + 1, number);
}
}
used[i] = false;
}
}