2 条题解

  • 0
    @ 2025-10-8 16:59:39
    #include<bits/stdc++.h>
    using namespace std;
    const int N=110, M=1e4+10;
    int f[M], a[N][N];//f[i]表示今天i个金币能换明天多少个金币
    int main()
    {
        int t, n, m;scanf("%d%d%d", &t, &n, &m);
        for(int i=1;i<=t;i++) for(int j=1;j<=n;j++) scanf("%d", &a[i][j]);
        int ans=m;
        for(int i=1;i<t;i++)
        {
            memset(f, 0xc0, sizeof(f));//0xc0=-0x3f, 反码
            f[ans]=ans;
            for(int j=1;j<=n;j++)
                for(int k=ans;k>=a[i][j];k--)
                    f[k-a[i][j]]=max(f[k-a[i][j]], f[k]-a[i][j]+a[i+1][j]);
            int t=ans;
            for(int j=0;j<=t;j++) ans=max(ans, f[j]);
        }
        printf("%d\n", ans);
        return 0;
    }
    
    • 0
      @ 2025-10-8 16:59:27
      #include<bits/stdc++.h>
      using namespace std;
      const int N=110,M=1e4+10;
      int f[M],a[N][N];//f[i]表示今天i个金币能换明天多少个金币
      int main()
      {
          int t,n,m;scanf("%d%d%d",&t,&n,&m);
          for(int i=1;i<=t;i++) for(int j=1;j<=n;j++) scanf("%d",&a[i][j]);
          int ans=m;
          for(int i=1;i<t;i++)
          {
              memset(f,0xc0,sizeof(f));//0xc0=-0x3f,反码
              f[ans]=ans;
              for(int j=1;j<=n;j++)
                  for(int k=ans;k>=a[i][j];k--)
                      f[k-a[i][j]]=max(f[k-a[i][j]],f[k]-a[i][j]+a[i+1][j]);
              int t=ans;
              for(int j=0;j<=t;j++) ans=max(ans,f[j]);
          }
          printf("%d\n",ans);
          return 0;
      }
      • 1

      【动态规划:状态设计DP】[CSP-J 2019] 纪念品

      信息

      ID
      1992
      时间
      1000ms
      内存
      250MiB
      难度
      6
      标签
      递交数
      17
      已通过
      12
      上传者