题目描述
选取和不超过S的若干个不同的正整数,使得所有数的约数(不含它本身)之和最大。
输入
输入一个正整数S。
输出
输出最大的约数之和。
样例输入
11
样例输出
9
思路:01背包,把s看为总量,把约数看为重量,就是一道01背包了。
代码:
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int n,a[2000];
int main()
{
freopen("maxsum.in","r",stdin);
freopen("maxsum.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=i/2;j++)//除以二是因为因数类似对称。
if(i%j==0)//判断是否没有余数
a[i]+=j;//累加。
for(int i=1;i<=n;i++)//DP
for(int j=1;j<=i/2;j++)
a[i]=max(a[i],a[j]+a[i-j]);
printf("%d",a[n]);//输出。
}