栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

P1734 最大约数和

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

P1734 最大约数和

最大约数和 题目描述

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

输入格式

输入一个正整数S。

输出格式

输出最大的约数之和。

样例 #1 样例输入 #1
11
样例输出 #1
9
提示

样例说明

取数字4和6,可以得到最大值(1+2)+(1+2+3)=9。

数据规模

S<=1000
解题思路:

同样的,我们一上来需要有一个基础的解题框架:按题目样例给的数字11来说,4+6不超过11,同样也不超过10,所以数字10的答案也是9。这就很容易让我们想到这题的动态规划解法:假设dp[n]是数字n的答案那么这里也就是说dp[11]=dp[10],这里我们能看到递归的影子,选不选数字 i 取决于选了之后是否比不选的大。也就是 : dp [ j ] = max(dp[j],dp[j-i]+a[i])这个过程应该从1一直遍历到n,每次遍历又需要从i+1 到 n 遍历,这max里面的dp[ j ]就是上一次遍历的结果,如果取的是dp[ j ]说明和上一次结果一样取法,反之就是取了j-i 和 i

上python代码,看代码或许容易理解:

n = int(input())
a = [0 for i in range(10001)]
dp = [0 for j in range(10001)]
for i in range(1, n // 2 + 1):
    for j in range(2, n):
        if i * j > n:
            break
        a[i * j] += i

for i in range(1, n + 1):
    for j in range(i, n + 1):
        dp[j] = max(dp[j], dp[j - i] + a[i])
print(dp[n])


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1026176.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号