最大约数和
最大约数和
题目描述
选取和不超过 \(S\) 的若干个不同的正整数,使得所有数的约数(不含它本身)之和最大。
输入格式
输入一个正整数 \(S\)。
输出格式
输出最大的约数之和。
样例 #1
样例输入 #1
11
样例输出 #1
9
提示
【样例说明】
取数字 \(4\) 和 \(6\),可以得到最大值 \((1+2)+(1+2+3)=9\)。
【数据规模】
对于 \(100 \%\) 的数据,\(1 \le S \le 1000\)。
Code
#include<bits/stdc++.h>
using namespace std;
int n,dp[1010],sum[1010],ans;
int main() {
cin >> n;
for(int i=1;i<=n/2;i++)
{
for(int j=2;i*j<=n;j++)
{
//i*j=当前数,那么i必为当前数的约数
sum[i*j]+=i;//sum数组记录每个数的约数和
}
}
for(int i=1;i<=n;i++)
{
for(int j=n;j>=i;j--)
{//模拟01背包,每个数只能使用1次
dp[j]=max(dp[j],dp[j-i]+sum[i]);//减去当前数,加上它的约数和
}
}
cout << dp[n];
return 0;
}
本文来自小默的博客,转载请注明原文链接:https://www.cnblogs.com/momotrace/p/p1734.html