|
思路:
用dp做,每个牌有三种情况 给a 给b谁都不给。详见代码。
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
long long n,x[101],y[101],sum,sum1;
long long dp[101][120001]//dp[i][j]代表当前遍历到第i个牌,两人个人值的差为j
int main()
{
//freopen("card.in","r",stdin);
//freoepn("card.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>x[i]>>y[i];
sum+=x[i];//把个人值的和加起来
}
memset(dp,-1,sizeof(dp));//一开始所有状态都是不存在的
dp[0][60000]=0;//只有初始状态 ,没发牌,两人个人值差为0;
for(int i=1;i<=n;i++)
{
for(int j=60000-sum;j<=60000+sum;j++)
{
if(dp[i-1][j]!=-1)//判断上一个状态是否存在
{
dp[i][j]=max(dp[i][j],dp[i-1][j]);这种是第i个牌谁都不给的情况
}
if(dp[i-1][j+x[i]]!=-1)
{
dp[i][j]=max(dp[i][j],dp[i-1][j+x[i]]+y[i]);//第i个牌给b的情况
}
if(dp[i-1][j-x[i]]!=-1)
{
dp[i][j]=max(dp[i][j],dp[i-1][j-x[i]]+y[i]);//第i个牌给a
}
}
}
cout<<dp[n][60000];//输出遍历完且个人值相等的情况
}