2 条题解

  • 1
    @ 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
    
    */
    
    • 0
      @ 2024-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
      标签
      递交数
      77
      已通过
      25
      上传者