zoukankan      html  css  js  c++  java
  • 落谷 P1734 最大约数和

    题目描述

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

    输入格式

    输入一个正整数S。

    输出格式

    输出最大的约数之和。

    输入输出样例

    输入 #1
    11
    输出 #1
    9

    说明/提示

    样例说明

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

    数据规模

    S<=1000

    第一眼看到这个题目的有点蒙,,没思路,,百度了一下,,,原来这么简单。
    思路:简单的01背包问题,先构造一个数组里面存有每个数x的约数和,然后约束和为价值,,对应的数字为体积,,总数s为背包容积,,,简单01背包问题。。唉!!
    #include<iostream>
    using namespace std;
    typedef long long ll;
    ll arr[1000+10];
    ll dp[1000+10];
    ll ysh(int x){
        int sum=0;
        for(int i=1;i<x;i++){
            if(x%i==0) sum+=i;
        }
        return sum;
    }
    int main(){
        int s;
        cin>>s;
        for(int i=1;i<s;i++){
            arr[i]=ysh(i);
        }
        for(int i=1;i<s;i++)
            for(int j=s;j>=i;j--)
                dp[j]=max(dp[j],dp[j-i]+arr[i]);
        cout<<dp[s]<<endl;
        return 0;
    }
    反思::遇到背包问题时有,一定要仔细考虑谁是价值谁知体积。


  • 相关阅读:
    驾照更换说明
    批处理创建快捷方式
    AC中保存数据与查询数据
    logger日志模块
    如何将python脚本转化为exe
    numpy学习
    request是个什么东西
    django的test文件的使用方式
    高频正则表达式
    dir 的作用
  • 原文地址:https://www.cnblogs.com/Accepting/p/11291191.html
Copyright © 2011-2022 走看看