zoukankan      html  css  js  c++  java
  • [洛谷P1734] 最大约数和 题解

    前言

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

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

    题目描述

    选取和不超过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;
    }
    

    后记

    按照这个思路可以出各种题啊(((比如什么所有数的(id^2*phi)和最大(((

  • 相关阅读:
    习题3.2三角形的知识1
    习题3.1三角形的知识2
    复习3.1三角形的知识1
    斜边和直角边公理、角的平分线11
    三角形全等的判定10
    全等三角形9
    你不知道的javascript(中卷)----读书笔记
    jquery----抽奖系统
    jQuery-----五子棋
    个人练手仿站
  • 原文地址:https://www.cnblogs.com/water-lift/p/13121783.html
Copyright © 2011-2022 走看看