1734 最大约数和
练背包来的
一般这种题就很难打暴力,连具体的实现都不行
说一下这道题的题意,给定一个数s,在1~s中找到若干个数,让他们的约数的和最大
所以我们用一个循环记录每一个数的约数和,存在a数组里面
然后我们需要双层循环,对于每一个数i,都去枚举数j看看i在哪一个数的价值是最大
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
int n;
int f[1000];
int a[1000];//a数组存储约数的和
int main()
{
cin>>n;
for(int i=1;i<=n/2;i++)
{
for(int j=2;i*j<=n;j++)
{
a[i*j]+=i;//当前数i*j的约数i
}
}
for(int i=1;i<=n;i++)
{
for(int j=i;j<=n;j++)//控制选的个数
{
f[j]=max(f[j],f[j-i]+a[i]);//01背包
}
}
cout<<f[n]<<endl;
return 0;
}