题目描述
选取和不超过S的若干个不同的正整数,使得所有数的约数(不含它本身)之和最大。 |
---|
输入
输出
数据范围限制
对于30%的数据, S<=10; |
---|
对于100%的数据, S <=1000。 |
提示
样例说明: |
---|
取数字4和6,可以得到最大值(1 + 2) + (1 + 2 + 3) = 9。 |
以下为题解
①预处理1~s的因数和
②从2开始枚举至s,枚举断点k,则
f[i]=max{f[k]+f[i-k]}
Code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int s,i,j,k,f[10001]={0};
int main()
{
freopen("maxsum.in","r",stdin);
freopen("maxsum.out","w",stdout);
scanf("%d",&s);
f[1]=0;
for (i=2;i<=s;i++)
for (j=1;j<=i/2;j++) if (i%j==0) f[i]+=j;
for (i=2;i<=s;i++)
for (k=1;k<=i/2;k++) f[i]=max(f[i],f[k]+f[i-k]);
printf("%d",f[s]);
fclose(stdin);
fclose(stdout);
return 0;
}
【日常琐事】
今天是来纪中的第二次排名第一祭