2 条题解
-
1lhs LV 8 @ 2023-8-7 11:18:34
60分代码 #include<bits/stdc++.h> #include<cstring> #include<queue> #include<set> #include<stack> #include<vector> #define ll long long using namespace std; const int N=1e5+10; const int M=2023; const int inf=0x3f3f3f3f; ll n,m,k,ans=-inf,pkqstrong=-inf; ll a[N],b[N],vis[1005][505]; void dfs(ll ball,ll strong,ll num,ll step)//剩余球数 剩余力量 捕捉的个数 第几个 { // cout<<ball<<" "<<strong<<" "<<num<<" "<<"step:"<<step<<" "<<a[step]<<" "<<b[step]<<"\n"; if(vis[ball][strong]>num)return; vis[ball][strong]=num; if(step==k+1 or ball==0 or strong<=0) { if(num>ans) { ans=num; pkqstrong=strong; } if(num==ans) { pkqstrong=max(pkqstrong,strong); } return; } if(strong-b[step]>0 and ball-a[step]>=0) { dfs(ball-a[step],strong-b[step],num+1,step+1); } dfs(ball,strong,num,step+1); } int main() { memset(vis,-1,sizeof vis); scanf("%lld%lld%lld",&n,&m,&k); for(int i=1;i<=k;i++) { scanf("%lld%lld",&a[i],&b[i]); } dfs(n,m,0,1); printf("%lld %lld",ans,pkqstrong); return 0; } /* */
//满分代码 #include<bits/stdc++.h> #include<cstring> #include<queue> #include<set> #include<stack> #include<vector> #define ll long long using namespace std; const int N=1e5+10; const int M=2023; const int inf=0x3f3f3f3f; int n,m,k,ans,dp[1005][505],a[N],b[N]; int main() { scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=k;i++)scanf("%d%d",&a[i],&b[i]); for(int i=1;i<=k;i++) { for(int j=n;j>=a[i];j--) { for(int kk=m;kk>=b[i];kk--) { dp[j][kk]=max(dp[j][kk],dp[j-a[i]][kk-b[i]]+1); } } } cout<<dp[n][m]<<" "; for(int i=0;i<=m;i++) { if(dp[n][i]==dp[n][m]) { cout<<m-i; return 0; } } return 0; } /* 389 207 155 300 299 170 158 65 */
-
02024-9-14 20:25:01@
满分代码
#include<bits/stdc++.h> #include<cstring> #include<queue> #include<set> #include<stack> #include<vector> #define ll long long using namespace std; const int N=1e5+10; const int M=2023; const int inf=0x3f3f3f3f; int n,m,k,ans,dp[1005][505],a[N],b[N]; int main() { scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=k;i++)scanf("%d%d",&a[i],&b[i]); for(int i=1;i<=k;i++) { for(int j=n;j>=a[i];j--) { for(int kk=m;kk>=b[i];kk--) { dp[j][kk]=max(dp[j][kk],dp[j-a[i]][kk-b[i]]+1); } } } cout<<dp[n][m]<<" "; for(int i=0;i<=m;i++) { if(dp[n][i]==dp[n][m]) { cout<<m-i; return 0; } } return 0; }
- 1
信息
- ID
- 3021
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 6
- 标签
- 递交数
- 88
- 已通过
- 27
- 上传者