最大约数和

最大约数和

题目描述

选取和不超过 \(S\) 的若干个不同的正整数,使得所有数的约数(不含它本身)之和最大。

输入格式

输入一个正整数 \(S\)

输出格式

输出最大的约数之和。

样例 #1

样例输入 #1

11

样例输出 #1

9

提示

【样例说明】

取数字 \(4\)\(6\),可以得到最大值 \((1+2)+(1+2+3)=9\)

【数据规模】

对于 \(100 \%\) 的数据,\(1 \le S \le 1000\)

分析

注意到题干中若干个不同的,因为我们可以把这个问题抽离为01背包问题。

代码实现

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;

const int N = 1010;

int n;
int v[N];
int f[N];
int y_sum(int x){
    int ans = 0;
    for(int i = 1; i < x;i ++){
        if(x%i==0)ans+=i;
    }
    return ans;
}
int main()
{
    cin >> n ;

    for (int i = 1; i <= n; i ++ ) 
        v[i] = y_sum(i);//预处理不同数的约数和
    for (int i = 1; i <= n; i ++ )
        for (int j = n; j >= i; j -- )
            f[j] = max(f[j], f[j - i] + v[i]);

    cout << f[n] << endl;

    return 0;
}
posted @ 2023-08-30 21:06  LongDz  阅读(52)  评论(0)    收藏  举报