3 条题解

  • 7
    @ 2023-8-20 18:44:37
    思路 对于每种学科相当于一组物品,每种物品只能选一个,题目就转化为相对比较简单的分组背包问题。只需要注意2点:(1)对于总体积j的枚举顺序是和01背包一样,是从大到小(2)和01背包相比,会多一层内部循环遍历每组的物品。
    代码
    
    #include<iostream>
    using namespace std;
    const int maxn = 105;
    int f[maxn], w[maxn][maxn];
    int main()
    {
        int n, m;
        cin >> n >> m;
        for (int i = 1; i <= n; ++i)
        {
            for (int j = 1; j <= m; ++j)
            {
                cin >> w[i][j];
            }
        }
        for (int i = 1; i <= n; ++i)
        {
            for (int j = m; j >= 1; --j)
            {
                for (int k = 1; k <= j; ++k)
                {
                    f[j] = max(f[j], f[j - k] + w[i][k]);
                }
            }
        }
        cout << f[m];
        return 0;
    }
    
    
    • 5
      @ 2024-5-5 15:59:50

      听好了乡巴佬们!这题不会做的要扣税!!!

      一级难度,我用脚指头都可以编写代码!!!

      题目就是简单的分组背包问题呀!!!不会的回到课里重听!!!注意一下:对于总体积j的枚举顺序是是01背包一毛一样,就是从大到小排。这道题会多一层内部循环遍历每组的物品。就成了三重循环。

      #include<iostream>
      
      using namespace std;
      const int MAXN = 105;
      int a[MAXN], b[MAXN][MAXN];
      int main()
      {
          int n, m;
          cin >> n >> m;
          for (int i = 1; i <= n; ++i)
          {
              for (int j = 1; j <= m; ++j)
              {
                  cin >> b[i][j];
              }
          }
          for (int i = 1; i <= n; ++i)
          {
              for (int j = m; j >= 1; --j)
              {
                  for (int k = 1; k <= j; ++k)
                  {
                      a[j] = max(a[j], a[j - k] + b[i][k]);
                  }
              }
          }
          cout << a[m];
          return 0;
      }
      //课上都讲过有啥难的?固定的代码,so easy!!!
      
      • 2
        @ 2024-4-27 17:06:27
        #include <bits/stdc++.h>
        using namespace std;
        int f[105], w[105][105];
        int main()
        {
            int n , m;
            cin >> n >> m;
            for(int i = 1 ; i <= n ; i++)
            {
                for(int j = 1 ; j <= m ; j++)
                {
                    cin >> w[i][j];
                }
            }
            for(int i = 1 ; i <= n ; i++)
            {
                for(int j = m ; j >= 1 ; j--)
                {
                    for(int k = 1 ; k <= j ; k++)
                    {
                        f[j] = max(f[j] , f[j - k] + w[i][k]);
                    }
                }
            }
            cout << f[m];
            return 0;
        }
        
        • 1

        信息

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