2 solutions
-
1
#include<bits/stdc++.h> using namespace std; const int N=2e5+10,P=1e9+7; int f[N*2]; //f[i+N]表示值为i时的方案数 int main() { int n,a,b,c; cin>>n>>a>>b>>c; f[n+N]=1; for(int i=n;i>c;i--) //倒着计算方案 { f[N+i-a]=(f[N+i-a]+f[N+i])%P; f[N+i-b]=(f[N+i-b]+f[N+i])%P; } int ans=0; //累加方案 for(int i=0;i<=N+c;i++) //小于等于c的方案数 { ans=(ans+f[i])%P; } cout<<ans; return 0; } -
0
【算法分析】 暴力搜索计算每种方案 #include<bits/stdc++.h> using namespace std; const int P=1e9+7; const int N=2e5+10; int f[N]; int n,a,b,c; int dfs(int now) { if(now<=c) return 1; return (dfs(now-a)+dfs(now-b))%P; } int main() { cin>>n>>a>>b>>c; cout<<dfs(n); return 0; } 记忆化搜索解法 #include<bits/stdc++.h> using namespace std; const int P=1e9+7; const int N=2e5+10; int f[N]; int n,a,b,c; int dfs(int now) { if(now<=c) return 1; if(f[now]==-1) //没有搜索过 { f[now]=(dfs(now-a)+dfs(now-b))%P; } return f[now]; //返回记录的答案 } int main() { cin>>n>>a>>b>>c; memset(f,-1,sizeof f); dfs(n); cout<<f[n]; return 0; }
- 1
Information
- ID
- 2171
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 5
- Tags
- # Submissions
- 19
- Accepted
- 5
- Uploaded By