题目描述
选取和不超过S的若干个不同的正整数,使得所有数的约数(不含它本身)之和最大。
输入格式
输入一个正整数S。
输出格式
输出最大的约数之和。
输入
11
输出
9
这题主要是一个转化,这里的s既是背包容量,又是物品种类。
#include<bits/stdc++.h>
using namespace std;
#define pi acos(-1)
#define mod 1e9+7
#define INF 0x3f3f3f
#define fi first
#define se second
#define it iterator
#define ins insert
#define mp make_pair
#define pb push_back
#define gcd __gcd
#define ll long long
#define ull unsigned long long
#define mem(a) memset(a,0,sizeof(a))
#define cio ios::sync_with_stdio(false)
#define T int t;scanf("%d",&t);while(t--)
#define CE cout << endl
#define C(n) cout << n << endl
#define CY cout << "YES" << endl
#define CN cout << "NO" << endl
#define Cy cout << "Yes" << endl
#define Cn cout << "No" << endl
int s[1010];
void init() // 预处理因子和
{
mem(s);
for(int i = 1; i <= 1000; i++){
for(int j = 1; j < i; j++){
if(i%j==0) s[i] += j;
}
}
}
int dp[1010][1010];
int main()
{
init();
int n;
cin >> n;
for(int i = 1; i <= n; i++) dp[1][n] = s[i];
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
if(j>=i){
dp[i][j] = max(dp[i-1][j],dp[i-1][j-i]+s[i]);
}else{
dp[i][j] = dp[i-1][j];
}
}
}
C(dp[n][n]);
return 0;
}