题目大概意思就是给定n个数,从中挑选一些数,让他们的和为总和的一半。
#include<bits/stdc++.h>
using namespace std;
//分割等和子集
//转换成01背包
//dp[i][j]表示第i次操作,值为j的情况 0表示不行 , 1表示可以
const int N=55;
int dp[N][N];
int n; int s;
int a[N];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
s+=a[i];
}
if(s%2)
{
cout<<-1;
return 0;
}
s/=2; dp[0][0]=1;
for(int i=1;i<=n;i++)
{
dp[i][0]=1;
for(int j=0;j<=s;j++)
{
if(j>=a[i])
dp[i][j]=dp[i-1][j-a[i]]|dp[i-1][j]; // 由i-1操作值为j-a[i]或值为j转移过来的
else
dp[i][j]|=dp[i-1][j]; //第i-1次操作值为j可以,那么i次操作依然可以
}
}
cout<<dp[n][s]; //n次选择为目标值是否能到达
}