洛谷 P1734 最大约数和

题目描述

选取和不超过S的若干个不同的正整数,使得所有数的约数(不含它本身)之和最大。

输入输出格式

输入格式:

 

输入一个正整数S。

 

输出格式:

 

输出最大的约数之和。

 

输入输出样例

输入样例#1:
11
输出样例#1:
9

说明

样例说明

取数字4和6,可以得到最大值(1+2)+(1+2+3)=9。

数据规模

S<=1000

背包dp
dp入门中。。
屠龙宝刀点击就送
#include <cstdio>
#include <cmath>
int dp[100005],s[1005],l;
void init()
{
    for(int sum=1,i=1;i<=1000;i++,sum=1)
    {
        for(int j=2;j<=sqrt(i);j++)
        {
            if(i%j==0)
            {
                sum+=j;
                if(j!=i/j) sum+=i/j;
            }
        }
        s[i]=sum;
    }
    s[1]=0;
}
int max(int a,int b) {return a>b?a:b;}
int main()
{
    init();
    scanf("%d",&l);
    for(int i=2;i<=l;i++)
        for(int j=l;j>=i;j--)
            dp[j]=max(dp[j-i]+s[i],dp[j]);
    printf("%d\n",dp[l]);
    return 0;
}

 

 
posted @ 2017-08-14 17:36  杀猪状元  阅读(219)  评论(1编辑  收藏  举报