最大约数和
最大约数和
题目描述
选取和不超过 \(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;
}

浙公网安备 33010602011771号