2 条题解
-
0
#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
#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
信息
- ID
- 1579
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 8
- 标签
- 递交数
- 110
- 已通过
- 17
- 上传者