首页 > 其他 > 详细

[洛谷P1734] 最大约数和 题解

时间:2020-06-13 22:08:46      阅读:42      评论:0      收藏:0      [点我收藏+]

前言

某天在洛谷上无意点开了“背包”的标签,发现了这道题。点进去一看,这是背包???这是普及-???

后来想了想,其实倒也不难,但是感觉这道题很有意思,于是就放上来了。

题目描述

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

输入格式

输入一个正整数S。

输出格式

输出最大的约数之和。

样例

样例输入

11

样例输出

9

样例说明

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

数据规模

S<=1000

思路

首先注意到数据范围,只有10的3次方。间接提示了做法是背包

因为要求选的每个数之和不超过S,不妨把S看做背包容量,那么每个数的值就是物品重量了。

然后因为题目要求约数和最大,所以不妨把约数和看做物品价值。

具体实现的时候还应注意,我们应该先把这S个数每个数的约数和处理出来,不然复杂度太大了。

处理方法:线性筛

代码

#include <bits/stdc++.h>
using namespace std;
int s;
int val[1005];
int dp[1005];

int main()
{
    cin >> s;
    for (int i = 1; i <= s; ++i)
        for (int j = 2; i * j <= s; ++j)
            val[i * j] += i;
    for (int i = 1; i <= s; ++i)
    {
        for (int j = s; j >= i; --j)
            dp[j] = max(dp[j], dp[j - i] + val[i]);
    }
    cout << dp[s] << endl;
}

[洛谷P1734] 最大约数和 题解

原文:https://www.cnblogs.com/water-lift/p/13121783.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!