2 solutions

  • 1
    @ 2025-8-19 11:33:13
    #include<bits/stdc++.h>
    using namespace std;
    const int N=10010;
    int a[N],b[N];
    int n,m;
    int ans=0;
    void dfs(int x,int w) //走到这个位置, 分数为w 
    {
        if(x>=n)
        {
         	ans=max(ans,w);
         	return ;
        }
        for(int i=0;i<m;i++)
        {
           dfs(x+a[i],w+b[x]);
        }
    }
    int main()
    {
        cin>>n>>m;
        for(int i=0;i<m;i++)
        {
            cin>>a[i];
        }
        for(int i=0;i<n;i++)
        {
            cin>>b[i];
        }
        dfs(0,0);
        cout<<ans; 
        return 0;
    }
    
    
    • 0
      @ 2026-2-28 20:04:06

      动态规划

      #include<bits/stdc++.h>
      using namespace std;
      const int N=1e4+10,M=110;
      int a[M],b[N],f[N];//f[i]表示走到第i关时分数的最大值。
      int main()
      {
          int n,m;
          cin>>n>>m;
          for(int i=0;i<m;i++)
          {
              cin>>a[i];
          }
          for(int i=0;i<n;i++)
          {
              cin>>b[i];
          }
          memset(f,-0x3f,sizeof f);
          f[0]=0;
          for(int i=0;i<n;i++)
          {
              if(f[i]==-0x3f3f3f3f)
              {
                  continue;
              }
              for(int j=0;j<m;j++)
              {
                  int x=i+a[j];
                  if(x>=n)
                  {
                      f[n]=max(f[n],f[i]+b[i]);
                      continue;
                  }
                  f[x]=max(f[x],f[i]+b[i]);
              }
          }
          cout<<f[n];
          return 0;
      }
      
      • 1

      Information

      ID
      2540
      Time
      1000ms
      Memory
      256MiB
      Difficulty
      5
      Tags
      (None)
      # Submissions
      42
      Accepted
      4
      Uploaded By