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;
    }
    反思::遇到背包问题时有,一定要仔细考虑谁是价值谁知体积。


  • 相关阅读:
    SharePoint Designer
    SharePoint Tricks
    树型dp(2019/1/19学习笔记) by csy
    2019/2/21测试(noip2015提高组day2
    loj刷题记录2019/2/20
    2019/2/16测试
    splay(水题)
    noip2016提高组day2
    2019/2/13测试(noip2016提高组day1原题)
    洛谷p1083借教室
  • 原文地址:https://www.cnblogs.com/Accepting/p/11291191.html
Copyright © 2011-2022 走看看