最大约数和
题目描述
选取和不超过 S S S 的若干个不同的正整数,使得所有数的约数(不含它本身)之和最大。
输入格式
输入一个正整数 S S S。
输出格式
输出最大的约数之和。
样例 #1
样例输入 #1
11
样例输出 #1
9
提示
【样例说明】
取数字 4 4 4 和 6 6 6,可以得到最大值 ( 1 + 2 ) + ( 1 + 2 + 3 ) = 9 (1+2)+(1+2+3)=9 (1+2)+(1+2+3)=9。
【数据规模】
对于 100 % 100 \% 100% 的数据, 1 ≤ S ≤ 1000 1 \le S \le 1000 1≤S≤1000。
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define inf 1e18
const int mod=1e9+7;
const int N=1010;
int n,m;
int cnt[N],v[N],dp[N][N];
void solve(){
cin>>n;
for(int i=1;i<=1000;i++){
for(int j=1;j<=i/j;j++){
if(i%j==0){
if(i!=1) cnt[i]+=j;
if(i/j!=j&&i/j!=i) cnt[i]+=i/j;
}
}
// cout<<i<<' '<<cnt[i]<<endl;
}
dp[0][0]=0;
for(int i=1;i<=1000;i++){
for(int j=0;j<=n;j++){
dp[i][j]=dp[i-1][j];
if(j>=i){
dp[i][j]=max(dp[i][j],dp[i-1][j-i]+cnt[i]);
}
}
}
cout<<dp[1000][n];
}
signed main(){
// ios::sync_with_stdio(false);
// cin.tie(nullptr);
// cout.tie(nullptr);
int tt=1;
// cin>>tt;
while(tt--) solve();
return 0;
}