YunYan

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

题目描述

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

 

反思::遇到背包问题时有,一定要仔细考虑谁是价值谁知体积。


posted on 2019-08-02 20:59  Target--fly  阅读(201)  评论(0编辑  收藏  举报