洛谷P1734 最大约数和(01背包)

题目描述

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

输入格式

输入一个正整数S。

输出格式

输出最大的约数之和。

输入输出样例

输入 #1 
11
输出 #1 
9

说明/提示

样例说明

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

数据规模

S<=1000

水题,注意体积维度是数字和(不超过S),价值维度是因子和。注意:因子不含本身,1的话因子和是0。
#include <bits/stdc++.h>
using namespace std;
int s[1005];
int dp[1005]={0};
int calc(int n)
{
    int ans=0,i;
    for(i=1;i<=n;i++)
    {
        if(i>sqrt(n))break;
        if(n%i!=0)continue;
        if(n/i==i)ans+=i;
        else ans=ans+i+n/i;
    }
    ans-=n;
    return ans;
}
int main()
{
    int i,j;
    int S;
    cin>>S;
    int ans=0;
    for(i=1;i<=S;i++)
    {
        s[i]=calc(i);//预处理出因子和
    }
    for(i=1;i<=S;i++)
    {
        for(j=S;j>=i;j--)
        {
            dp[j]=max(dp[j],dp[j-i]+s[i]);
            ans=max(ans,dp[j]);
        }    
    }
    cout<<ans;
    return 0;
}


原文地址:https://www.cnblogs.com/lipoicyclic/p/12353394.html