最大约数和

最大约数和

题目描述

选取和不超过 \(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;
}
posted @ 2023-05-30 19:41  Momo·Trace  阅读(60)  评论(0编辑  收藏  举报