题目描述

选取和不超过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[+];
ll dp[+];
ll ysh(int x){
int sum=;
for(int i=;i<x;i++){
if(x%i==) sum+=i;
}
return sum;
}
int main(){
int s;
cin>>s;
for(int i=;i<s;i++){
arr[i]=ysh(i);
}
for(int i=;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 ;
}
反思::遇到背包问题时有,一定要仔细考虑谁是价值谁知体积。

05-20 02:41
查看更多