[洛谷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\)和最大(((
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现