zoukankan      html  css  js  c++  java
  • P1734_最大约数和

    题目描述

    选取和不超过S的若干个不同的正整数,使得所有数的约数(不含它本身)之和最大。

    输入输出格式
    输入格式:
    输入一个正整数S。

    输出格式:
    输出最大的约数之和。

    输入输出样例
    输入样例#1:11
    输出样例#1:9

    说明

    • 样例说明 取数字4和6,可以得到最大值(1+2)+(1+2+3)=9。
    • 数据规模S<=1000

      和不超过某个数,又要让约数和最大,这很容易让人想起背包问题。想到这里问题就解决了。
      把每个数的大小看作weight数组,每个数本身的约数和看作value数组。这就是个01背包问题。

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    int s, v[1001], dp[1001];
    
    int num(int a)
    {
        if (a == 1)
            return 0;
        int countt = 1, temp = a;
        for (int i = 2; i < a; i++)
            if (!(temp % i))
                countt += i;
        return countt;
    }
    
    int main()
    {
        cin >> s;
        for (int i = 1; i <= s; i++)
            v[i] = num(i);
        for (int i = 1; i <= s; i++)
            for(int j = s; j >= i; j--)
                dp[j] = max(dp[j], dp[j - i] + v[i]);
        cout << dp[s];
        return 0;
    }

    为了节省空间(其实没必要啦)我没有开weight数组——因为weight就是数嘛还开了干嘛!

  • 相关阅读:
    轻量级通用上采样算子-CARAFE
    图像分割-Mask Scoring R-CNN
    对C#Chart控件使用整理
    C#中的三种timer
    C#的三大难点
    将Excel的数据导入DataGridView中(转)
    状态者设计模式
    C# 中 DataTable 使用详解。
    Excel连接字符串在.NET中的应用
    状态机设计思想
  • 原文地址:https://www.cnblogs.com/InedibleKonjac/p/12654967.html
Copyright © 2011-2022 走看看