社区讨论
求助思路正确性
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 条回复,欢迎继续交流。
正在加载回复...