• 最大约数和


    预处理出每个数的约数和。

    把每个数的大小看出质量,约数和看为价值,s为最大的背包质量。

    这样就转化为01背包了

    #include <cstdio>
    #include <iostream>
    #include <cmath>
    using namespace std;
    int ys[1011];
    int dp[1100];
    void pre()
    {
        for(int i=1;i<=1000;i++)
         {
             for(int j=1;j<=sqrt(i);j++)
              if(i%j==0)
              {
                  ys[i]+=j;
                  if(j*j!=i) ys[i]+=(i/j);
              }
              ys[i]-=i;
              //printf("%d ",ys[i]);
         }
    }
    int main()
    {
        pre();
        int s;
        scanf("%d",&s);
        for(int i=2;i<=s;i++)
         for(int j=s;j>=i;j--)
          dp[j]=max(dp[j],dp[j-i]+ys[i]);
        printf("%d",dp[s]);
    }
    
  • 相关阅读:
    2015第14周四
    2015第14周三
    2015第14周二
    2015第14周一
    2015第13周日
    2015第13周六
    2015第13周五
    2015第13周四
    2015第13周三
    2015第13周二
  • 原文地址:https://www.cnblogs.com/ht008/p/7737572.html
Copyright © 2020-2023  润新知