0
点赞
收藏
分享

微信扫一扫

uniapp 安卓图片编辑原生插件

ivy吖 2024-05-05 阅读 14

算法提高之机器分配

  • 核心思想:分组背包 + dfs求最短路

    • 1.再每一个组中取一个利润 求最大(分组背包)
    • 2.dfs求最短路:每一个f[i][j]都是有f[i-1][k]转移得到 所以遍历所有f[i-1][k],找到最大利润路线中的方案
      • 然后递归
  •   #include <iostream>
      #include <cstring>
      #include <algorithm>
      
      using namespace std;
      const int N = 20;
      
      int f[N][N],w[N][N];
      int path[N];
      int n,m,cnt;
      
      void dfs(int u,int v)
      {
          if(!u) return;
          
          for(int j=0;j<=v;j++)  //遍历所有k -->  遍历所有的f[i-1][k]
          {
              if(f[u-1][v-j] + w[u][j] == f[u][v])  .//找到最大利润中的方案
              {
                  path[cnt++] = j;
                  dfs(u-1,v-j);
                  return;
              }
          }
      }
      int main()
      {
          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=1;j<=m;j++)
                  for(int k=0;k<=j;k++)  //遍历所有能取的k 每个都求一次最值
                      f[i][j] = max(f[i][j],f[i-1][j-k] + w[i][k]);
          cout<<f[n][m]<<endl;
          
          dfs(n,m);
          for(int i=cnt-1,id=1;i>=0;i--,id++)
          {
              cout<<id<<" "<<path[i]<<endl;
          }
      }
    
举报

相关推荐

Flutter通过插件调用原生安卓

0 条评论