点击跳转例题
思路:预处理出每个数的约数和,然后用01背包
#include <bits/stdc++.h> #define int long long //(有超时风险) #define PII pair<int,int> #define endl '\n' #define LL __int128 using namespace std; const int N=2e5+10,M=1e3+10,mod=998244353,INF=0x3f3f3f3f; int a[N],sum[N],f[N]; signed main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); //我们预处理每个数是哪些数的约数, //降低时间复杂度为nlogn int n;cin>>n; for(int i=1;i<=n;i++) for(int j=2;j<=n/i;j++) sum[i*j]+=i; //f[i]表示和不超过i的正整数中所有的约数之和最大为多少; for(int i=1;i<=n;i++) { for(int j=n;j>=i;j--) f[j]=max(f[j],f[j-i]+sum[i]); } cout<<f[n]<<endl; return 0; }
P1734 最大约数和--数学,01背包
于 2024-03-04 20:14:32 首次发布
文章介绍了如何使用C++编程语言,通过预处理每个数的约数和并运用01背包算法,降低时间复杂度,计算给定范围内正整数的所有约数之和的最大值。
摘要由CSDN通过智能技术生成