思路:
我们把小于等于s的每个正整数看成一个物品,他们打价值c[i]就是其所有约数和,体积v[i]看成就是看i,背包容量是s,就背包容量s下,能获得的最大价值和.
每个数只能或不选,所有我们考虑01背包
ACocde:
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10,M=1e6+10;
int f[N],v[N],c[N],m;
void solve() {
cin>>m;
for(int i=1;i<=m;i++){
for(int j=1;j*j<=i;j++){
if(i%j==0) c[i]+=j;
}
v[i]=i;
}
for(int i=1;i<=m;i++){
for(int j=m;j>=v[i];j--){
f[j]=max(f[j],f[j-v[i]]+c[i]);
}
}
cout<<f[m]<<"\n";
}
int main() {
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int tt=1;
//cin>>tt;
while(tt--) solve();
return 0;
}
over~