P1734 最大约数和
题目:
选取和不超过S的若干个不同的正整数,使得所有数的约数(不含它本身)之和最大。
思路:
01背包小微调
S不大,才1000,暴力求出1-S的数的前缀和 转换为01背包问题
状态方程变化 f [ j ] = m a x ( f [ j ] , f [ j − i ] + g [ i ] ) f[j]=max(f[j],f[j-i]+g[i]) f[j]=max(f[j],f[j−i]+g[i])
AC代码:
#include<iostream>
const int N = 1111;
using namespace std;
int n,f[N],g[N];
void get(){
for(int i=2;i<=1000;i++)
for(int j=1;j<i;j++)
}
int main(){
cin>>n;get();
for(int i=1;i<=n;i++)
for(int j=n;j>=i;j--)
f[j]=max(f[j],f[j-i]+g[i]);
cout<<f[n];
return 0;
}