题目:
题目描述
选取和不超过S的若干个不同的正整数,使得所有数的约数(不含它本身)之和最大。
输入格式
输入一个正整数S。
输出格式
输出最大的约数之和。
输入输出样例
输入 #1
11
输出 #1
9
说明/提示
样例说明
取数字4和6,可以得到最大值(1+2)+(1+2+3)=9。
数据规模
S<=1000
思路:
把它当做01背包来做就行了。
s为物品个数和背包容量,c[i]为1至s中数的约数之和,w[i]为第i个数。
抄代码有害身心,请不要抄袭代码!!!
#include <bits/stdc++.h>
using namespace std;
int dp[1010][1010],s,a[1010],w[1010];
void f(){
for(int i=1;i<=s;i++){
w[i]=i;
int n=i,cnt=0;
for(int j=1;j<n;j++){
if(n%j==0){
cnt+=j;
}
}
a[i]=cnt;
}
}
int main(){
cin>>s;
f();
for (int i=1;i<=s;i++){
for (int j=0;j<=s;j++){
if(j>=w[i]){
dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+a[i]);
}else{
dp[i][j]=dp[i-1][j];
}
}
}
cout<<dp[s][s];
return 0;
}
END