P1734 最大约数和

题目描述

选取和不超过S的若干个不同的正整数,使得所有数的约数(不含它本身)之和最大。

输入输出格式

输入格式:

 

输入一个正整数S。

 

输出格式:

 

输出最大的约数之和。

 

输入输出样例

输入样例#1: 复制
11
输出样例#1: 复制
9

说明

样例说明

取数字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 }

(加油)

posted @ 2019-01-28 20:33  darrrr  阅读(171)  评论(0编辑  收藏  举报