题目描述
选取和不超过S的若干个不同的正整数,使得所有数的约数(不含它本身)之和最大。
输入输出格式
输入格式:
输入一个正整数S。
输出格式:
输出最大的约数之和。
输入输出样例
输入样例#1:
11
输出样例#1:
9
说明
样例说明
取数字4和6,可以得到最大值(1+2)+(1+2+3)=9。
数据规模
S<=1000
背包dp
dp入门中。。
屠龙宝刀点击就送
#include <cstdio> #include <cmath> int dp[100005],s[1005],l; void init() { for(int sum=1,i=1;i<=1000;i++,sum=1) { for(int j=2;j<=sqrt(i);j++) { if(i%j==0) { sum+=j; if(j!=i/j) sum+=i/j; } } s[i]=sum; } s[1]=0; } int max(int a,int b) {return a>b?a:b;} int main() { init(); scanf("%d",&l); for(int i=2;i<=l;i++) for(int j=l;j>=i;j--) dp[j]=max(dp[j-i]+s[i],dp[j]); printf("%d ",dp[l]); return 0; }