题目描述
选取和不超过S的若干个不同的正整数,使得所有数的约数(不含它本身)之和最大。
输入格式
输入一个正整数S。
输出格式
输出最大的约数之和。
输入输出样例
输入
11
输出
9
说明/提示
样例说明
取数字4和6,可以得到最大值(1+2)+(1+2+3)=9。
数据规模
S<=1000
洛谷上的一道题,是用背包来做,本题核心是预处理
#include<iostream>
using namespace std;
int n;
int dp[1011];
int main(){
cin>>n;
int sum=0;
for(int i=2;i<1010;i++)
{
for(int j=1;j<i;j++){
if(i%j==0){
dp[i]+=j;
}
}
}
for(int i=2;i<1010;i++)
{
for(int j=2;j<i;j++){
dp[i]=max(dp[i],dp[i-j]+dp[j]);
}
}
cout<<dp[n];
}
}