社区讨论

求助思路正确性

P13018[GESP202506 七级] 调味平衡参与者 2已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@mmaa8nak
此快照首次捕获于
2026/03/03 15:24
上周
此快照最后确认于
2026/03/06 17:45
4 天前
查看原帖
rt
CPP
#include <bits/stdc++.h>
using namespace std;
const int N = 105;
const int M = 201005;
int a[N],b[N];
int dp[N][M][2][2];
//dp[i][j]表示前i个食材选择后,|A-B|=j,A>=B(0)/A<B(1)的情况下,不选(0)/选(1)当前食材,A+B的和的最大值
int maxn = 0,minn = 0;
int main()
{
    memset(dp,-1,sizeof dp);
    dp[0][0][0][0] = dp[0][0][0][1] = 0;
    int n;
    cin>>n;
    for(int i = 1;i<=n;i++)
    {
        cin>>a[i]>>b[i];
        if(a[i]-b[i]>0) maxn+=a[i]-b[i];
        else minn+=a[i]-b[i];
    }
    for(int i = 1;i<=n;i++)
    {
        //不选
        for(int j = minn;j<=maxn;j++)
        {
        	if(j>=0)
        	{
				dp[i][j][0][0] = max(dp[i-1][j][0][0],dp[i-1][j][0][1]);
			}
			else
			{
				dp[i][-1*j][1][0] = max(dp[i-1][-1*j][1][0],dp[i-1][j][1][1]);
			}
        }
        //选
        int s = a[i]-b[i];
        for(int j = minn;j<=maxn;j++)
        {
        	if(j>=0)
        	{
				if(max(dp[i-1][j][0][0],dp[i-1][j][0][1])==-1) continue;
				if(j+s>=0)
				{
					dp[i][j+s][0][1] = max(dp[i-1][j][0][0],dp[i-1][j][0][1])+a[i]+b[i];
				}
				else
				{
					dp[i][-1*(j+s)][1][1] = max(dp[i-1][j][0][0],dp[i-1][j][0][1])+a[i]+b[i];
				}
			}
			else
			{
				if(max(dp[i-1][-1*j][1][0],dp[i-1][-1*j][1][1])==-1) continue;
				if(j+s>=0)
				{
					dp[i][j+s][0][1] = max(dp[i-1][-1*j][1][0],dp[i-1][-1*j][1][1])+a[i]+b[i];
				}
				else
				{
					dp[i][-1*(j+s)][1][1] = max(dp[i-1][-1*j][1][0],dp[i-1][-1*j][1][1])+a[i]+b[i];
				}
			}
        }
    }
    int ans = -1;
    for(int i = 1;i<=n;i++)
    {
        ans = max({ans,dp[i][0][0][0],dp[i][0][0][1]});
        // cout<<dp[i][0][0][0]<<" "<<dp[i][0][0][1]<<"\n";
    }
    cout<<ans<<"\n";
    return 0;
}

回复

4 条回复,欢迎继续交流。

正在加载回复...