4 条题解

  • 9
    @ 2024-5-15 19:22:33

    代码如下

    #include <bits/stdc++.h>
    using namespace std;
    int n,f[1000001],w[1000001];
    void work(int x){//用一个子函数进行计算,求出i的所有约数和.
        for(int i = 1;i < x;i++) if(x % i == 0) w[x]+=i;
    }
    int main(){
        cin >> n;
        for(int i = 1;i <= n;i++) work(i);
        for(int i = 1;i <= n;i++){
            for(int j = n;j >= i;j--){//对于数字i来说,它的体积就是i本身.
                f[j] = max(f[j],f[j-i]+w[i]);//后面就是一个标准的01背包问题,可以参考课上的代码。
            }
        }
        cout << f[n];//最后输出f[n]就行了
        return 0;
    }
    

    ❤️ ***~ 一个赞抱走~***❤️

    • 5
      @ 2023-8-3 16:15:12
      思路 这道题相对比较简单,对于数字i来说,它的体积就是i本身,它的价值可以用一个子函数进行计算,求出i的所有约数和就可以了~后面就是一个标准的01背包问题就不赘述了。
      代码
      
      #include<iostream>
      using namespace std;
      int s,w[10002];
      int f[10002];
      void work(int x)
      {
      	for(int i=1;i<x;i++)
      		if(x%i==0)
      			w[x]+=i;
      }
      int main()
      {
      	cin>>s;
      	for(int i=1;i<=s;i++) 
      		work(i);
      	for(int i=1;i<=s;i++)
      		for(int j=s;j>=i;j--)
      			f[j]=max(f[j],f[j-i]+w[i]);
      	cout<<f[s];
      	return 0;
      }
      
      
      • -1
        @ 2024-5-7 17:39:50

        按课上老师讲的:

        #include<iostream>
        using namespace std;
        int s,w[10002];
        int f[10002];
        void work(int x)
        {
        	for(int i=1;i<x;i++)
        		if(x%i==0)
        			w[x]+=i;
        }
        int main()
        {
        	cin>>s;
        	for(int i=1;i<=s;i++) 
        		work(i);
        	for(int i=1;i<=s;i++)
        		for(int j=s;j>=i;j--)
        			f[j]=max(f[j],f[j-i]+w[i]);
        	cout<<f[s];
        	return 0;
        }
        
        
        • -1
          @ 2023-12-10 21:11:21
          #include <bits/stdc++.h>
          #define ll long long
          #define endl "\n"
          using namespace std;
          int s, v[1005], f[1005];
          int main()
          {
              ios::sync_with_stdio(false);
              cin.tie(0);
              cin >> s;
              for (int i = 1; i <= s; i++)
              {
                  for (int j = 1; j * j <= i; j++) // 约数和
                  {
                      if (i % j == 0)
                      {
                          v[i] += j + i / j;
                          if (j == i / j)
                          {
                              v[i] -= j;
                          }
                      }
                  }
                  v[i] -= i;
                  for (int j = s; j >= i; j--) // 01背包
                  {
                      f[j] = max(f[j], f[j - i] + v[i]);
                  }
                  // cout << v[i] << " ";
              }
              cout << endl << f[s];
              return 0;
          }
          
          • 1

          信息

          ID
          372
          时间
          1000ms
          内存
          256MiB
          难度
          1
          标签
          (无)
          递交数
          353
          已通过
          264
          上传者