P1734 最大约数和
选取和不超过 S 的若干个不同的正整数,使得所有数的约数(不含它本身)之和最大。
1. 动态规划 + 筛预处理
vector<int> prime(10e3+1,1);//约数和,即价值
int init = []() {//筛预处理
for(int i=2;i<prime.size();i++){
for(int j=2*i;j<prime.size();j=j+i)
prime[j]+=i;
}
return 0;
}();
void maxval(int V){
vector<long long> dp(V+1);
long long res = 0;
for(int i=2;i<=V;i++) //遍历每一个数
for(int j=V;j>=i;j--){
dp[j] = max(dp[j],dp[j-i]+prime[i]);
res = max(res,dp[j]);
}
cout<<res;
return;
}