2 条题解

  • 0
    @ 2025-10-8 16:57:58
    #include <bits/stdc++.h>
    using namespace std;
    const int N=5e4;
    int n,cn,fn,m,c[N],dp[N];
    bool vis[N];
    unordered_map<int , bool>mp;
    int dfs(int x)
    {
    	if(vis[x]){ printf("-1\n");exit(0); }
    	if(dp[x]) return dp[x];
    	vis[x]=1;
    	if(mp[x] && x!=n) dp[x]=max(dp[x],dfs(x+m));
    	for(int i=1;i<=cn;i++) if(x>=c[i]) dp[x]=max(dp[x],c[i]+dfs(x-c[i]));
    	vis[x]=0;//这里设置vis为0,才能让vis=1成为判断环的条件
    	return dp[x];
    }
    int main()
    {
    	scanf("%d%d%d%d",&n,&cn,&fn,&m);
    	for(int i=1;i<=cn;i++)scanf("%d",&c[i]);
    	for(int i=1,x;i<=fn;i++)scanf("%d",&x), mp[x]=1;
    	memset(dp,0,sizeof dp);
    	printf("%d\n", dfs(n) );
    	return 0;
    }
    
    • 0
      @ 2025-10-8 16:57:51
      #include <bits/stdc++.h>
      using namespace std;
      const int N=5e4;
      int n,cn,fn,m,c[N],dp[N];
      bool vis[N];
      unordered_map<int , bool>mp;
      int dfs(int x)
      {
      	if(vis[x]){ printf("-1\n");exit(0); }
      	if(dp[x]) return dp[x];
      	vis[x]=1;
      	if(mp[x] && x!=n) dp[x]=max(dp[x],dfs(x+m));
      	for(int i=1;i<=cn;i++) if(x>=c[i]) dp[x]=max(dp[x],c[i]+dfs(x-c[i]));
      	vis[x]=0;//这里设置vis为0,才能让vis=1成为判断环的条件
      	return dp[x];
      }
      int main()
      {
      	scanf("%d%d%d%d",&n,&cn,&fn,&m);
      	for(int i=1;i<=cn;i++)scanf("%d",&c[i]);
      	for(int i=1,x;i<=fn;i++)scanf("%d",&x), mp[x]=1;
      	memset(dp,0,sizeof dp);
      	printf("%d\n", dfs(n) );
      	return 0;
      }
      • 1

      *【记忆化搜索】吃糖果[USACO10NOV] Candy S

      信息

      ID
      1579
      时间
      1000ms
      内存
      128MiB
      难度
      8
      标签
      递交数
      110
      已通过
      17
      上传者