题目描述
选取和不超过S的若干个不同的正整数,使得所有数的约数(不含它本身)之和最大。
输入输出格式
输入格式:
输入一个正整数S。
输出格式:
输出最大的约数之和。
输入输出样例
说明
样例说明
取数字4和6,可以得到最大值(1+2)+(1+2+3)=9。
数据规模
S<=1000
----------------------------------------------------
先算出小于等于0的所有数的约数和
然后
就可以转换为01背包问题
1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 int v[1010],f[1010]; 5 int n; 6 7 int num(int a) 8 { 9 if(a == 1) 10 return 0; 11 int ans = 1,temp=a; 12 for(int j=2; j<a; j++) 13 if(temp % j == 0) 14 ans+=j; 15 return ans; 16 } 17 18 int main() 19 { 20 scanf("%d",&n); 21 for(int i=1; i<=n; i++) 22 { 23 v[i]=num(i); 24 } 25 //实质为01背包问题 26 for(int i=1; i<=n; i++) //每个数都试一边 27 for(int j=n; j>=i; j--) 28 f[j]=max(f[j],f[j-i]+v[i]); 29 printf("%d",f[n]); 30 return 0; 31 }
(加油)