P1734 最大約數和
阿新 • • 發佈:2019-05-12
-- 尋找 整數 聯系 turn str 背包 vector map
題目
題目描述
選取和不超過S的若幹個不同的正整數,使得所有數的約數(不含它本身)之和最大。
鏈接
傳送門
思路
還是一道比較水的題,基本的01背包思想,註意找出與01背包的聯系(只不過多了一步尋找約數和的過程)註意求約數和不循環到該數本身
把i本身當體積,把約數和當價值
代碼
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<queue> #include<stack> #include<vector> #include<map> #include<string> #include<cstring> #define ll long long int using namespace std; const int maxn=999999999; const int minn=-999999999; inline int read() { char c = getchar(); int x = 0, f = 1; while(c < '0' || c > '9') { if(c == '-') f = -1; c = getchar(); } while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar(); return x * f; } int s; int calc(int x) { int ans=0; for(int i=1; i<x; ++i) { //註意不包括x本身 if(x%i==0) { ans+=i; } } return ans; } int f[100000],a[100000]; int main() { cin>>s; for(int i=1; i<=s; ++i) { a[i]=calc(i); } for(int i=1; i<=s; ++i) { for(int j=s; j>=i; --j) { f[j]=max(f[j],f[j-i]+a[i]); } } cout<<f[s]; return 0; }
P1734 最大約數和