這道題思路就是算出數組總和,在數組中找到和最接近數組總和一半的一些數。
可以用01揹包解決這道題,dp[i][j]表示在數組前i項中最接近j的最大值。
狀態轉移方程爲:dp[i][j]=max(dp[i-1][j],dp[i-1][j-a[i]]+a[i]);
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int dp[105][10005];
int main()
{
int n,sum=0,i,j;
cin>>n;
int a[10005];
for(i=1;i<=n;i++)
{
cin>>a[i];
sum+=a[i];
}
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++)
for(j=sum/2;j>=a[i];j--)
dp[i][j]=max(dp[i-1][j],dp[i-1][j-a[i]]+a[i]);
cout<<sum-2*dp[n][sum/2]<<endl;
return 0;
}