5 条题解

  • 2
    @ 2025-8-3 10:41:00
    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    const int N=1e3+520;
    int w1[N],w2[N];
    int n,m,hp;
    int dp[N][N];
    signed main(){
    	cin>>m>>hp>>n;
    	for(int i=1;i<=n;i++){
    		cin>>w1[i]>>w2[i]; 
    	}
    	for(int i=1;i<=n;i++){
    		for(int j=m;j>=w1[i];j--){
    			for(int k=hp;k>=w2[i];k--){
    				dp[j][k]=max(dp[j][k],dp[j-w1[i]][k-w2[i]]+1);
    			}
    		} 
    	}
    	cout<<dp[m][hp]<<" ";
    	for(int i=0;i<=hp;i++){
    		if(dp[m][hp]==dp[m][i]){
    			cout<<hp-i;
    			return 0;
    		}
    	}
    	return 0;
    }
    //说好不哭
    
    
    • 1
      @ 2025-5-25 21:06:03

      还有谁能比我短?

      #include<iostream>
      int i,j,l,n,m,k,a[1005],b[1005],dp[1005][1005];int main(){std::cin>>n>>m>>k;for(i=1;i<=k;i++)std::cin>>a[i]>>b[i];for(i=1;i<=k;i++)for(j=n;j>=a[i];j--)for(l=m;l>=b[i];l--)dp[j][l]=std::max(dp[j][l],dp[j-a[i]][l-b[i]]+1);for(i=0;i<=m;i++)if(dp[n][i]==dp[n][m]){std::cout<<dp[n][m]<<" "<<m-i;return 0;}}
      
    • 0
      @ 2025-8-3 10:44:50

      #include<bits/stdc++.h> using namespace std; const int N=1e5; const int INF = 0x3f3f3f3f; int n,m,hp; int dp[1010][1010]; int w1[N],w2[N]; int main(){ cin >> m>>hp>>n; for(int i=1;i<=n;i++){ cin >> w1[i] >>w2[i]; } for(int i=1;i<=n;i++){ for(int j = m;j>=w1[i];j--){ for(int k=hp;k>=w2[i];k-- ){ dp[j][k] = max(dp [j][k] , dp[j - w1[i]] [k - w2[i]] +1 ); } } } cout << dp[m][hp]<<" "; int pos=lower_bound(dp[m],dp[m] + hp + 1,dp[m][hp])-dp[m]; cout << hp-pos; return 0; }^^^^^^^^^^

      • 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;
        }
        
        • 0
          @ 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
          
          */
          
          • 1

          信息

          ID
          3021
          时间
          1000ms
          内存
          256MiB
          难度
          6
          标签
          递交数
          183
          已通过
          70
          上传者