(姚*夫出版)
【题目描述】
选取数之和不超过 的若干个不同正整数,使得所有数的约数(不含它本身)之和最大。
【输入数据】
输入一个正整数 。
【输出数据】 输出最大的约数之和。
【样例输入】 2 3 2
【样例输出】11
【样例说明】9
取数字 4 和 6 ,可以得到最大值 (1+2)+(1+2+3)=9 。 【数据规模】 30%数据满足, ; 100%数据满足, 。
【样例代码】
#include<bits/stdc++.h>
using namespace std;
int ys(int x){
int y=0;
for(int i=1;i<x;i++){
if(x%i==0)y+=i;
}
return y;
}
struct S {
int ans;
int sum;
}a[10001];
bool cmp(S x,S y){
return x.ans>y.ans;
}
int f[1001][1001];
int main()
{
//freopen("maxsum.in","r",stdin);
//freopen("maxsum.out","w",stdout);
int n;
cin>>n;
for(int i=1;i<=n;i++){
a[i].ans=ys(i);
a[i].sum=i;
}
for(int i=1;i<=n;i++)
for(int v=n;v>0;v--)
if(a[i].sum<=v)f[i][v]=max(f[i-1][v],f[i-1][v-a[i].sum]+a[i].ans);
else f[i][v]=f[i-1][v];
cout<<f[n][n];
return 0;
}