解题思路:这是一个0-1背包问题。对于每个数字,放或者不放入背包,最后使得背包中的数字之和最接近且小于所有数字总和的一半。
源码附上:
#include <iostream>
#include <algorithm>
using namespace std;
int A[101],dp[101][10001];
//dp[i][j]表示考虑第i个数字是否放入背包中,且背包中的数字总和不超过j
int main()
{
int N;
cin>>N;
int i,j,sum=0;
for(i=1;i<=N;i++)
{
cin>>A[i];
sum+=A[i];
}
for(i=1;i<=N;i++)
{
for(j=1;j<=sum/2;j++)
{
//当前数字不能放入背包中
if(j<A[i])
{
dp[i][j]=dp[i-1][j];
}
else
{
dp[i][j]=max(dp[i-1][j],dp[i-1][j-A[i]]+A[i]);//取该数字放入背包和不放入背包两种情况的最大值
}
}
}
cout<<(sum-dp[N][sum/2])-dp[N][sum/2]<<endl;
return 0;
}