01背包模板题
#include <bits/stdc++.h>
using namespace std;
const int N = 1e3 + 10;
int a[N];
int sum[N];
int n;
int f[N];
void chk(int x){
sum[x]++;//1是所有数的约数
for(int i = 2; i < x; i++){
if(x % i == 0){
sum[x] += i;
}
}
}
int main(){
cin >> n;
sum[1] = 0;
sum[2] = 1;
sum[3] = 1;
for(int i = 4; i <= n; i++){
chk(i);
}
for(int i = 1; i <= n; i++){
for(int j = n; j >= i; j--){
f[j] = max(f[j],f[j - i] + sum[i]);
}
}
//因不一定取到n,可能取到小于n的数。。好吧,f[n]也成功AC,没有理清这两者之间的关系
int res = 0;
for(int i = 0; i <= n; i++) res = max(res,f[i]);
cout << res << endl;
return 0;
}