#include <bits/stdc++.h>
using namespace std;
const int N=1010;
int s;
int n,m;
int v[N],w[N],f[N];
int accum(int p) { //预先处理约数之和
int ans=0;
for(int i=1; i<=p-1; i++) { //因为不包括它本身因此 p-1;
if(p%i==0) ans+=i;
}
return ans;
}
int main() {
cin>>s;
n=s; //需要枚举的个数为 s;
m=s; //最大背包容量为s (不超过s)
for(int i=1;i<=n;i++){
v[i]=i; //物品的重量为 数字 i
w[i]=accum(i); //约数之和为价值
}
//01背包
for(int i=1;i<=n;i++){
for(int j=m;j>=v[i];j--){
f[j]=max(f[j],f[j-v[i]]+w[i]);
}
}
cout<<f[s];
return 0;
}
标签:约数,背包,最大,int,P1734,cout
From: https://www.cnblogs.com/ltphy-/p/18216472