版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_42391248/article/details/84202058
这道题思路就是算出数组总和,在数组中找到和最接近数组总和一半的一些数。
可以用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;
}