题目描述
选取“和不超过S”的若干个不同的正整数,使得所有数的约数(不含它本身)之和最大。
输入格式
输入一个正整数S,1≤S≤1000。
输出格式
输出最大的约数之和。
输入样例
11
输出样例
9
取数字4和6,可以得到最大值(1+2)+(1+2+3)=9。
解法
思路
本题属于背包问题,给出了一个S,既是背包容量,也限定了数值范围,即物品范围,则每个数的约数之和是这个数的价值。所以本题是给定一个容量为s的背包和s种体积为i、价值为“i的约束和”的物品,求能获得的最大价值。
代码
#include<iostream>
#include<cmath>
using namespace std;
int main(){
int s=0;
int f[1001]={},w[1001]={},v[1001]={};
cin>>s;
for(int i=1;i<=s;i++){
w[i]=i;
for(int j=1;j<i;j++){
if(i%j==0)
v[i]+=j;
}
}
for(int i=1;i<=s;i++){
for(int j=s;j>=i;j--){
f[j]=max(f[j],f[j-w[i]]+v[i]);
}
}
cout<<f[s];
return 0;
}