The universe said you are not |

Momo·Trace

园龄:3年3个月粉丝:6关注:1

最大约数和

最大约数和

题目描述

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

输入格式

输入一个正整数 S

输出格式

输出最大的约数之和。

样例 #1

样例输入 #1

11

样例输出 #1

9

提示

【样例说明】

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

【数据规模】

对于 100% 的数据,1S1000

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;
}
posted @   Momo·Trace  阅读(90)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起