P1734 最大约数和

发布时间 2023-08-23 01:04:42作者: 失控D大白兔

选取和不超过 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;
}