1. 程式人生 > >luogu P1734 最大約數和 (01 背包)

luogu P1734 最大約數和 (01 背包)

bad reg 背包 max void 一道 最大值 orange name

鏈接:https://www.luogu.org/problemnew/show/P1734

題面:

題目描述

選取和不超過S的若幹個不同的正整數,使得所有數的約數(不含它本身)之和最大。

輸入輸出格式

輸入格式:

輸入一個正整數S。

輸出格式:

輸出最大的約數之和。

輸入輸出樣例

輸入樣例#1: 復制
11
輸出樣例#1: 復制
9

說明

樣例說明

取數字4和6,可以得到最大值(1+2)+(1+2+3)=9。

數據規模

S<=1000


思路:

把這個數的因數和看成這個數的權值,那麽就可以轉化成一道01背包了,因為數據非常小,直接暴力預處理出每個數的因數和。

實現代碼;

#include<bits/stdc++.h>
using namespace std;
const int M = 1e5+10;
int a[M],dp[M],n;
void init(){
    for(int i = 1;i <= n;i ++)
        for(int j = 1;j < i;j ++)
            if(i%j==0) a[i] += j;
}

int main()
{
    cin>>n;
    init();
    for(int i = 1;i <= n;i ++){
        
for(int j = n;j >= i;j --){ dp[j] = max(dp[j],dp[j-i]+a[i]); } } cout<<dp[n]<<endl; }

luogu P1734 最大約數和 (01 背包)