题目描述
选取和不超过S的若干个不同的正整数,使得所有数的约数(不含它本身)之和最大。
输入格式
输入一个正整数S。
输出格式
输出最大的约数之和。
输入输出样例
输入 #1
11
输出 #1
9
还是01背包问题
import java.util.*;
public class Main {
int n = 0, m = 0;
int[] a = new int[1010];
int[] b = new int[1010];
public static void main(String[] args) {
new Main().sf();
}
public void sf() {
Scanner in = new Scanner(System.in);
n = in.nextInt();
for (int i = 1; i <= n / 2; i++) {
for (int j = 2; i * j <= n; j++) {
a[i * j] += i; // 计算每个数的约数和挺棒的
}
}
for (int i = 1; i <= n; i++) {
for (int j = i; j <= n; j++) {
b[j] = Math.max(b[j], b[j - i] + a[i]); // i 本身当做价钱, a[i] 当做价值,j为数字容量,所能装的最大价值
}
}
System.out.println(b[n]);
}
}
第二个
import java.util.*;
public class Main {
public static void main(String[] args) {
Main m = new Main();
m.handleInput();
}
int n = 0, t = 0;
int[] a = new int[1010];
int[] b = new int[1010];
public void handleInput() {
Scanner in = new Scanner(System.in);
if (in.hasNext()) {
n = in.nextInt();
}
for (int i = 1; i <= n; i++) {
a[i] = sf(i);
}
for (int i = 1; i <= n; i++) {
for (int j = n; j >= i; j--) {
b[j] = Math.max(b[j], b[j - i] + a[i]);
}
}
System.out.println(b[n]);
}
public int sf(int x) {
int ans = 0;
for (int i = 1; i < x; i++) {
if (x % i == 0) { // 这个 方法求 约数和 也能过
ans += i;
}
}
return ans;
}
}